MySQL的不可重複讀和幻讀

2021-09-23 22:27:24 字數 1203 閱讀 6170

不可重複讀

不可重複讀是指在同乙個事務中,兩次(或以上)查詢發現符合條件的資料記錄的字段值發生了變化,導致不可重複讀出現的原因主要是update操作

不可重複讀的例子

alice和bob開啟了資料庫的兩個事務;

bob讀取post_comment表中所有post_id為1的資料;

alice修改了post_id為1的資料;

alice提交了她的事務;

如果bob重複讀取post_id為1的資料,他將發現結果集的字段值發生了變化;

幻讀

幻讀是指在同乙個事務中,兩次(或以上)查詢同乙個範圍內的資料,發現資料的數量不同,導致幻讀問題的原因主要是insert和delete操作

幻讀的例子

alice和bob開啟了資料庫的兩個事務;

bob讀取post_comment表中所有post_id為1的資料;

alice增加了一條post_id為1的資料;

alice提交了她的事務;

如果bob重複讀取post_id為1的資料,他將發現結果集的記錄數量發生了變化;

幻讀的重點在於新增或者刪除

不可重複讀的重點是修改

在mysql中不可重複讀和幻讀的解決辦法(在rr隔離界別中)

mvcc(多版本併發控制)保證了資料的可重複讀,也保證了不會讀到幻讀資料(即使是有新的符合條件的資料產生,在同乙個事務的下次查詢中也查不到,蒙蔽自己的雙眼假裝看不到)

在mysql的innodb儲存引擎中,mvcc中普通方式(select * from table)查詢資料是不加任何鎖的,資料的篩選除了通過查詢條件之外,還要根據資料行的隱藏字段(兩個版本號)來和事務的版本號來進行比較後過濾. 這樣做的好處是支援的併發量更高(因為不加鎖),根據版本號來過濾資料也解決了不可重複讀的問題,也能保證不會讀到幻讀資料. 

record lock(記錄鎖)和gap lock(間隙鎖)保證了幻讀資料不會產生(在讀取資料的時候加鎖,防止在讀取時有其他事務對讀取條件內的資料做增刪改操作)

也就是說如果你要完全解決幻讀問題,還要在查詢語句中使用像lock in share mode和for update這樣顯式的加鎖語句

ps: 本人新手乙個,如果有什麼寫的不對的,希望各位大佬能幫忙指正一下,感謝

MySQL不可重複讀與幻讀

一直把不可重複讀與幻讀沒搞太明白,有天看到乙個說法覺得挺有道理 不可重複讀 針對的是單條記錄,另乙個事務修改了本事務讀的記錄,再次讀時,記錄改變了。解決此問題需要行鎖 幻讀 針對的是整個表,第一次讀9條記錄,第二次讀變成8條或者10條。解決此問題需要表鎖。mysql應該用的mvcc控制。個人理解 讀...

髒讀 不可重複讀和幻讀

髒讀 a事務讀取b事務尚未提交的更改資料,並在這個資料的基礎上進行操作,這時候如果事務b回滾,那麼a事務讀到的資料是不被承認的。不可重複讀 指a事務讀取了b事務已經提交的更改資料。幻讀 a事務讀取b事務提交的新增資料,會引發幻讀問題。對於這兩種問題解決採用不同的辦法,防止讀到更改資料,只需對操作的資...

髒讀,幻讀和不可重複讀

當乙個事務a正在訪問資料,並修改了資料,還沒提交到資料庫中。此時,另乙個事務b也訪問了這個資料,然後使用這個資料。e.g.1.mary的原工資為1000,財務人員將mary的工資改為了8000 但未提交事務 2.mary讀取自己的工資 發現自己的工資變為了8000,歡天喜地!3.而財務發現操作有誤,...