在MySQL中,幻讀是指一個(gè)事務(wù)在讀取了一組記錄之后,另一個(gè)事務(wù)又插入了滿足該查詢條件的記錄,之后第一個(gè)事務(wù)再次查詢時(shí),就會(huì)發(fā)現(xiàn)多了一些記錄。
MySQL使用鎖和MVCC來解決幻讀問題。
-- 鎖 SELECT ... FROM ... WHERE ... FOR UPDATE; -- 對(duì)查詢結(jié)果加鎖,保證其他事務(wù)無法插入記錄 -- MVCC SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; -- 設(shè)置事務(wù)隔離級(jí)別為可重復(fù)讀,避免其他事務(wù)的修改 -- 通過使用InnoDB存儲(chǔ)引擎的MVCC機(jī)制,MySQL可以在讀取一個(gè)記錄時(shí)生成一個(gè)快照,這個(gè)快照用來保證當(dāng)前事務(wù)以可重復(fù)讀的方式操作這個(gè)記錄時(shí),不會(huì)被其他事務(wù)修改。 -- 當(dāng)然,這個(gè)快照并不能防止其他事務(wù)插入一條新記錄,也就是無法解決幻讀問題。這時(shí)可以使用鎖來保證讀取結(jié)果的一致性。
綜上所述,MySQL通過鎖和MVCC機(jī)制來解決幻讀問題。