“Mysql如何解決幻讀問題”
一個作業了4年小伙伴,去一個美團面試,遇到了這樣一個問題,
大家好,我是Mic,一個作業了14年的Java程式員
關于這個問題,面試官想考察什么?我們應該如何回答呢?
問題決議
這個問題至少考察的是3年以上開發經驗的同學,
Mysql底層去解決并發事務問題,至少是要有一定的技識訓累才能真正理解,
而如果作為一個剛作業沒多久的程式員,必須要知道資料庫的事務隔離級別的問題,
因為不同的隔離級別對于資料的安全性影響是不同的,
也就是存在臟讀、幻讀、不可重復讀等問題,
所謂幻讀,就是一個事務前后兩次讀取到的資料條數不一致,
在第一個事務里面執行一個范圍查詢,這個時候滿足查詢的資料只有一條,
接著第二個事務里面插入一條資料并且提交了,然后在第一個事務里面再次查詢的時候發現有兩條資料滿足條件,

在RR事務隔離級別下,引入了MVCC和LBCC這兩種方式來解決幻讀問題,
MVCC類似于一種樂觀鎖的設計,簡單來說就是針對每個事務生成一個事務版本,然后針對這個版本定義了訪問規則
-
一個事務只能看到第一次查詢之前已經提交的事務以及當前事務的修改,
-
一個事務不能看到當前事務第一次查詢之后創建的事務,以及未提交的事務修改,
但是,如果在一個事務里面存在當前讀的情況下,MVCC還是會存在幻讀問題,因為當前讀不是讀快照,而是直接讀記憶體,
所以針對這種情況,可以使用LBCC也就是基于鎖的機制來解決,也就是常說的行鎖、表鎖、間隙鎖等
基于對上述知識的理解,如果沒有對Mysql不同事務隔離級別的底層實作原理有一個清晰認識的同學在回答這個問題的時候,要么就是很生硬,要么就是無法擴展,就會顯得有點像是在背答案,
下面看看高手是怎么回答這個問題的吧,
高手:
在RR(也就是可重復讀)的事務隔離級別下,InnoDB采用了MVCC機制來解決幻讀問題,
MVCC就是一種樂觀鎖的機制,它通過對不同事務生成不同的快照版本,通過UNDO版本鏈進行管理并且在MVCC里面,規定了高版本能夠看到低版本的事務變更,低版本看不到高版本的事務變更從而實作了不同事務之間的資料隔離,解決了幻讀的問題,
但是在當前讀的情況下,是直接讀取記憶體的資料,跳過了快照度,所以還是會出現幻讀問題,
我認為可以通過兩個方式來解決,
- 第一種是盡量避免當前讀的情況
- 第二種是引入LBCC的方式
以上就是我對這個問題的理解,
總結
好了,今天的分享就到這里結束了
如果喜歡我的作品,記得點贊、收藏、關注!!!
需要Java面試合集,金九銀十面試秘籍掃下方!
著作權宣告:本博客所有文章除特別宣告外,均采用 CC BY-NC-SA 4.0 許可協議,轉載請注明來自
Mic帶你學架構!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力,歡迎關注「跟著Mic學架構」公眾號公眾號獲取更多技術干貨!

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/508773.html
標籤:其他
