“Mysql如何解決幻讀問題” 一個工作了4年小伙伴,去一個美團面試,遇到了這樣一個問題。 大家好,我是Mic,一個工作了14年的Java程式員 關於這個問題,面試官想考察什麼?我們應該如何回答呢? 問題解析 這個問題至少考察的是3年以上開發經驗的同學。 Mysql底層去解決併發事務問題,至少是要有 ...
“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學架構」公眾號公眾號獲取更多技術乾貨!