談談你對MySQL事務隔離級別的理解
?一位5年工作經驗的粉絲,去阿里面試被問到一個關于數據庫事務隔離級別的問題,當時,沒有問答上來,希望給他一個參考答案。那么,今天我給大家談談我的理解。
另外,我花了1個多星期把往期的面試題解析配套文檔準備好了,一共有10W字,想獲取的小伙伴可以從我的個人煮葉簡介中找到。
1.臟讀、幻讀、不可重復讀
在SQL操作中,多個事務競爭可能會產生三種不同的現象,分別是臟讀、幻讀、不可重復讀。
首先來看臟讀,如圖所示,
假設有兩個事務T1/T2同時在執行,T1事務有可能會讀取到T2事務未提交的數據,但是未提交的事務T2可能會回滾,也就導致了T1事務讀取到最終不一定存在的數據產生臟讀的現象。
然后來看幻讀,如圖所示:
假設有兩個事務T1/T2同時執行,事務T1執行范圍查詢或者范圍修改的過程中,事務T2插入了一條屬于事務T1范圍內的數據并且提交了,這時候在事務T1查詢發現多出來了一條數據,或者在T1事務發現這條數據沒有被修改,看起來像是產生了幻覺,這種現象稱為幻讀。
最后來看,不可重復讀,如圖所示:
假設有兩個事務T1/T2同時執行,事務T1在不同的時刻讀取同一行數據的時候結果可能不一樣,從而導致不可重復讀的問題。
2.事務隔離級別
那么事務隔離級別,就是是為了解決多個并行事務競爭, 。而這臟讀、幻讀、不可重復讀這三種現象在實際應用中,有些業務場景是不能接受這些現象存在的,所以在SQL標準中定義了四種隔離級別,分別是:
讀未提交,在這種隔離級別下,可能會產生臟讀、不可重復讀、幻讀。
讀已提交(RC),在這種隔離級別下,可能會產生不可重復讀和幻讀。
可重復讀(RR),在這種隔離級別下,可能會產生幻讀
串行化,在這種隔離級別下,多個并行事務串行化執行,不會產生安全性問題。
這四種隔離級別里面,只有串行化解決了全部的問題,但這種隔離級別的性能是最低的。
在MySQL里面,InnoDB引擎默認的隔離級別是RR(可重復讀),因為它需要保證事務ACID特性中的隔離性特征。
以上就是我對 MySQL事務隔離級別的理解。我是被編程耽誤的文藝Tom,如果我的分享對你有幫助,請動動手指一鍵三連分享給更多的人。關注我,面試不再難!?