不可重復讀主要是針對update和delete來說,而幻讀則是針對insert來說。
不可重復讀的簡單理解
事務A進行查詢,事務未提交。而事務B此時對記錄進行update,並提交事務。當事務A再次查詢(事務未提交的時候),發現兩次數據不一樣,則是重復讀。
幻讀的理解
事務A查詢表中的所有記錄數,未提交事務,此時事務B insert了一條數據,提交事務。當事務A再次查詢(事務未提交的時候),發現多了一條數據。
對比
兩者產生的結果都是前后數據不一致,但是對於不可重復讀 可以針對查詢的那條數據加索即行鎖,保證只有當前事務能夠對這條記錄進行更新,刪除等。就可以重復讀。MySQL的默認隔離級別就是可重復讀 REPEATABLE-READ。而要消滅幻讀則要鎖住整張表,保證當前操作的時候,不能有其他事務對表進行insert操作。可將數據庫的隔離級別設置為serializable即串行化來避免。
