一個作業了6年的粉絲,去阿里面試,在第一面的時候被問到”Mysql的事務隔離級別“,
他竟然沒有回答上來,一直在私信向我訴苦,
我說,你只能怪年輕時候的你,那個時候不夠努力導致現在的你技術水平不夠,
好吧,關于這個問題,看看普通人和高手的回答,
普通人:
Mysql的事務隔離級別它有四種
1.讀已提交
2.可重復讀
3.串行化
4.未提交讀
這四種隔離級別代表的是說我在不同的那個...就是我多個事務競爭的時候那么我每一個就是我的這個事務并發執行的時候并行執行的時候我對資料的一個影響,
比如說我事務之間的一個隔離性,所以通過不同的這種隔離級別它可以去解決所謂的這個幻讀或者不可重復讀以及說那個讀未提交這些問題,
然后我記得就是這個最安全的是那種就串行化,串行化就是說它不會存在任何的這個上面幻讀不可重復讀的一些問題,
高手:
好的,關于這個問題,我會從幾個方面來回答,
首先,事務隔離級別,是為了解決多個并行事務競爭導致的資料安全問題的一種規范,
具體來說,多個事務競爭可能會產生三種不同的現象,
-
假設有兩個事務T1/T2同時在執行,T1事務有可能會讀取到T2事務未提交的資料,但是未提交的事務T2可能會回滾,也就導致了T1事務讀取到最終不一定存在的資料產生臟讀的現象,

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

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

而這三種現象在實際應用中,可能有些場景不能接受某些現象的存在,所以在SQL標準中定義了四種隔離級別,分別是:
- 讀未提交,在這種隔離級別下,可能會產生臟讀、不可重復讀、幻讀,
- 讀已提交(RC),在這種隔離級別下,可能會產生不可重復讀和幻讀,
- 可重復讀(RR),在這種隔離級別下,可能會產生幻讀
- 串行化,在這種隔離級別下,多個并行事務串行化執行,不會產生安全性問題,
這四種隔離級別里面,只有串行化解決了全部的問題,但也意味著這種隔離級別的性能是最低的,
在Mysql里面,InnoDB引擎默認的隔離級別是RR(可重復讀),因為它需要保證事務ACID特性中的隔離性特征,
以上就是我對這個問題的理解,
總結
關于這個問題,很多用Mysql5年甚至更長時間的程式員都不一定非常清楚的知道,
這其實是不正常的,因為雖然InnoDB默認隔離級別能解決99%以上的問題,但是有些公司的某些業務可能會修改隔離級別,
而如果你不知道,就很可能在程式中出現莫名其妙的問題,
如果有任何面試問題、職業發展問題、學習問題,都可以私信我,
著作權宣告:本博客所有文章除特別宣告外,均采用 CC BY-NC-SA 4.0 許可協議,轉載請注明來自
Mic帶你學架構!
如果本篇文章對您有幫助,還請幫忙點個關注和贊,您的堅持是我不斷創作的動力,歡迎關注「跟著Mic學架構」公眾號公眾號獲取更多技術干貨!

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