在MySQL數(shù)據(jù)庫中,幻讀是指在一個事務(wù)中多次執(zhí)行同一查詢語句,但是每次查詢結(jié)果不同,這種現(xiàn)象比之前的臟讀、不可重復(fù)讀更為嚴(yán)重,給事務(wù)處理帶來極大的困難。
MySQL通過一種名為next-key locking的機(jī)制來解決幻讀問題,它采用行鎖和間隙鎖相結(jié)合的方式,保證了同一事務(wù)中連續(xù)的查詢結(jié)果是一致的。
-- 創(chuàng)建測試表orders CREATE TABLE orders ( id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, order_no VARCHAR(50) NOT NULL, amount DECIMAL(10, 2) DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY `order_no` (`order_no`) ) ENGINE=InnoDB; -- 在orders表中插入數(shù)據(jù) INSERT INTO orders (order_no, amount) VALUES ('100001', 100), ('100002', 200), ('100003', 300); -- 開啟事務(wù) BEGIN; -- 查詢orders表的所有記錄,獲得間隙鎖 SELECT * FROM orders WHERE order_no BETWEEN '100000' AND '100100' FOR UPDATE; -- 在orders表中插入一條新記錄 INSERT INTO orders (order_no, amount) VALUES ('100004', 400); -- 提交事務(wù) COMMIT;
在以上代碼中,我們通過SELECT...FOR UPDATE語句獲取了orders表中order_no值在100000和100100之間的所有記錄的間隙鎖,保證了我們后續(xù)的插入操作不會產(chǎn)生幻讀問題。
下一篇360搜圖json