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