理解MySQL事務隔離級別

大雄45發表於2022-11-14
導讀 在MySQL裡面,InnoDB引擎預設的隔離級別是RR(可重複讀),因為它需要保證事務ACID特性中的隔離性特徵。

一位5年工作經驗的粉絲,去阿里面試被問到一個關於資料庫事務隔離級別的問題,當時,沒有問答上來,希望給他一個參考答案。那麼,今天我給大家談談我的理解。

另外,我花了1個多星期把往期的面試題解析配套文件準備好了,一共有10W字,想獲取的小夥伴可以從我的個人煮葉簡介中找到。

1.髒讀、幻讀、不可重複讀

在SQL操作中,多個事務競爭可能會產生三種不同的現象,分別是髒讀、幻讀、不可重複讀。

首先來看髒讀,如圖所示,

理解MySQL事務隔離級別理解MySQL事務隔離級別

假設有兩個事務T1/T2同時在執行,T1事務有可能會讀取到T2事務未提交的資料,但是未提交的事務T2可能會回滾,也就導致了T1事務讀取到最終不一定存在的資料產生髒讀的現象。

然後來看幻讀,如圖所示:

理解MySQL事務隔離級別理解MySQL事務隔離級別

假設有兩個事務T1/T2同時執行,事務T1執行範圍查詢或者範圍修改的過程中,事務T2插入了一條屬於事務T1範圍內的資料並且提交了,這時候在事務T1查詢發現多出來了一條資料,或者在T1事務發現這條資料沒有被修改,看起來像是產生了幻覺,這種現象稱為幻讀。

最後來看,不可重複讀,如圖所示:

理解MySQL事務隔離級別理解MySQL事務隔離級別

假設有兩個事務T1/T2同時執行,事務T1在不同的時刻讀取同一行資料的時候結果可能不一樣,從而導致不可重複讀的問題。

2.事務隔離級別

那麼事務隔離級別,就是是為了解決多個並行事務競爭, 。而這髒讀、幻讀、不可重複讀這三種現象在實際應用中,有些業務場景是不能接受這些現象存在的,所以在SQL標準中定義了四種隔離級別,分別是:

讀未提交,在這種隔離級別下,可能會產生髒讀、不可重複讀、幻讀。

讀已提交(RC),在這種隔離級別下,可能會產生不可重複讀和幻讀。

可重複讀(RR),在這種隔離級別下,可能會產生幻讀

序列化,在這種隔離級別下,多個並行事務序列化執行,不會產生安全性問題。

這四種隔離級別裡面,只有序列化解決了全部的問題,但這種隔離級別的效能是最低的。

在MySQL裡面,InnoDB引擎預設的隔離級別是RR(可重複讀),因為它需要保證事務ACID特性中的隔離性特徵。

以上就是我對 MySQL事務隔離級別的理解。我是被程式設計耽誤的文藝Tom,如果我的分享對你有幫助,請動動手指一鍵三連分享給更多的人。關注我,面試不再難!

原文來自:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69955379/viewspace-2902845/,如需轉載,請註明出處,否則將追究法律責任。

相關文章