【Java面試】請你簡單說一下Mysql的事務隔離級別

跟著Mic學架構 發表於 2022-06-10
Java 面試 MySQL

一個工作了6年的粉絲,去阿里面試,在第一面的時候被問到”Mysql的事務隔離級別“。

他竟然沒有回答上來,一直在私信向我訴苦。

我說,你只能怪年輕時候的你,那個時候不夠努力導致現在的你技術水平不夠。

好吧,關於這個問題,看看普通人和高手的回答。

普通人:

Mysql的事務隔離級別它有四種

1.讀已提交
2.可重複讀
3.序列化
4.未提交讀

這四種隔離級別代表的是說我在不同的那個...就是我多個事務競爭的時候那麼我每一個就是我的這個事務併發執行的時候並行執行的時候我對資料的一個影響。

比如說我事務之間的一個隔離性,所以通過不同的這種隔離級別它可以去解決所謂的這個幻讀或者不可重複讀以及說那個讀未提交這些問題。

然後我記得就是這個最安全的是那種就序列化,序列化就是說它不會存在任何的這個上面幻讀不可重複讀的一些問題。

高手:

好的,關於這個問題,我會從幾個方面來回答。

首先,事務隔離級別,是為了解決多個並行事務競爭導致的資料安全問題的一種規範。

具體來說,多個事務競爭可能會產生三種不同的現象。

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

    image-20220421232707839

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

    image-20220421232859097

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

    image-20220421233141866

而這三種現象在實際應用中,可能有些場景不能接受某些現象的存在,所以在SQL標準中定義了四種隔離級別,分別是:

  1. 讀未提交,在這種隔離級別下,可能會產生髒讀、不可重複讀、幻讀。
  2. 讀已提交(RC),在這種隔離級別下,可能會產生不可重複讀和幻讀。
  3. 可重複讀(RR),在這種隔離級別下,可能會產生幻讀
  4. 序列化,在這種隔離級別下,多個並行事務序列化執行,不會產生安全性問題。

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

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

以上就是我對這個問題的理解。

總結

關於這個問題,很多用Mysql5年甚至更長時間的程式設計師都不一定非常清楚的知道。

這其實是不正常的,因為雖然InnoDB預設隔離級別能解決99%以上的問題,但是有些公司的某些業務可能會修改隔離級別。

而如果你不知道,就很可能在程式中出現莫名其妙的問題。

如果有任何面試問題、職業發展問題、學習問題,都可以私信我。

file

版權宣告:本部落格所有文章除特別宣告外,均採用 CC BY-NC-SA 4.0 許可協議。轉載請註明來自 Mic帶你學架構
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力。歡迎關注「跟著Mic學架構」公眾號公眾號獲取更多技術乾貨!

【Java面試】請你簡單說一下Mysql的事務隔離級別