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