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