MySQL的可重復讀級別能解決幻讀嗎


mvcc解決了快照讀的幻讀,間隙鎖解決了當前讀的幻讀

https://juejin.im/post/5c9040e95188252d92095a9e

http://blog.sina.com.cn/s/blog_499740cb0100ugs7.html

 

 

幻讀定義:在一個事務里面兩次不同時間的相同查詢返回了不同的的結果集,這里的不同主要是指結果集的數量不同,而不是內容不同。

 mysql的innodb引擎是通過 "行排他鎖+MVCC" 一起實現的, 不僅可以保證可重復讀, 還可以部分防止幻讀, 而非完全防止;  

 為啥說並沒有完全杜絕呢?下面的情況就是mysql通過next-key鎖機制杜絕了一些幻讀。

操作流程:(1)T1在查詢users

                  (2)T1更新表中的一列數據,這時候會加next-key鎖。

                  (3)T2事務進行插入操作,由於T1加了next-key鎖,所以這里T2插入會阻塞,直到T1提交。

                  (4)T1在查詢數據,所有的users表中那一列的數據都更新了。

   如果沒有next-key鎖機制,T2事務的插入操作不會被阻塞,這時候T1在讀的時候就會出現有一行數據沒有更新的情況出現。這時候就會出現網上很多博客說的情況。明明更新了所有數據,

   但是在查詢的時候,還 會出現沒有更新的數據,貌似出現了幻覺一樣。

  但是上面的操作mysql通過next-key鎖機制預防了那種情況的發送,所以解決此部分的幻讀。

 

即使有了next-key鎖,但是還有一部分幻讀怎么沒有解決呢?

操作流程:(1)T1在查詢users,有五行數據

                  (2)T2插入中的一行數據,並且提交,目前有六行數據。

                  (3)T1事務進行更新一列的操作,會影響六行數據。

                  (4)T1在查詢數據,所有的users表中那一列的數據都更新了,但是查詢出來了六行數據。

這時候,出現了一次事務兩次查詢,結果集數量不同,這算是一個種特殊幻讀。

這篇文章給出明確答案,對於mysql的rr級別對於幻讀的解決:https://segmentfault.com/a/1190000012650596

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM