溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

MySQL中有哪些事務(wù)隔離級(jí)別

發(fā)布時(shí)間:2021-07-13 14:51:53 來(lái)源:億速云 閱讀:107 作者:Leah 欄目:大數(shù)據(jù)

本篇文章為大家展示了MySQL中有哪些事務(wù)隔離級(jí)別,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

事務(wù)的四大ACID 屬性:Atomicity 原子性、Consistency 一致性、Isolation 隔離性、Durability 持久性。

原子性: 事務(wù)是最小的執(zhí)行單位不可分割,強(qiáng)調(diào)事務(wù)的不可分割。
一致性: 事務(wù)執(zhí)行前后,數(shù)據(jù)的完整性保持一致。
持久性: 一旦事務(wù)執(zhí)行結(jié)束,數(shù)據(jù)就保存到數(shù)據(jù)庫(kù)。
隔離性: 一個(gè)事務(wù)執(zhí)行的前后不應(yīng)該受到其他事務(wù)的干擾。

MySQL的事務(wù)隔離級(jí)別有四種:未提交讀、已提交讀、可重復(fù)讀和串行化。

未提交讀: 事務(wù)A可以讀取到事務(wù)B還未提交的數(shù)據(jù)。比如事務(wù)B將小明的賬戶余額從100改到110,事務(wù)B還沒提交,在這個(gè)隔離級(jí)別下事務(wù)A就讀取到的數(shù)據(jù)就是110。如果說(shuō)事務(wù)B回滾了,那數(shù)據(jù)庫(kù)里小明的賬戶余額又變成100了,可是事務(wù)A返回的數(shù)據(jù)卻是110。這就造成了臟讀。

已提交讀: 事務(wù)A讀取到數(shù)據(jù)是事務(wù)B提交后的數(shù)據(jù),即一個(gè)事務(wù)提交后,其變更才會(huì)被另一個(gè)事務(wù)讀取到。比如事務(wù)B將小明的賬戶余額從100改到110,事務(wù)B還沒提交的時(shí)候,事務(wù)A讀取到的數(shù)據(jù)仍然是100。因?yàn)樵谶@個(gè)隔離級(jí)別下一個(gè)事務(wù)只能讀取到另一個(gè)事務(wù)修改后且提交事務(wù)后的數(shù)據(jù)。但是這種情況會(huì)造成一個(gè)問題就是,事務(wù)A在事務(wù)B隱式提交數(shù)據(jù)后讀取到的數(shù)據(jù)是110,這是沒問題的,但是在事務(wù)A還沒提交前,事務(wù)B又將小明的賬戶余額改為120并隱式提交,然后事務(wù)A再來(lái)讀取的時(shí)候就讀到了120,所以事務(wù)A的兩次讀取結(jié)果不一致。這就造成了不可重復(fù)讀。

可重復(fù)讀: 事務(wù)A只能讀到事務(wù)B修改的已提交了事務(wù)的數(shù)據(jù),但是第一次讀取的數(shù)據(jù),即使別的事務(wù)修改了這個(gè)值,這個(gè)事務(wù)再讀取這條數(shù)據(jù)的時(shí)候還是和第一次獲取的一樣,不會(huì)隨著別的事務(wù)的修改而改變。這和已提交讀的區(qū)別就在于,它重復(fù)讀取的值是不變的。所以叫可重復(fù)讀,很貼切的名字。拿剛才的例子就是,事務(wù)A在自己的事務(wù)里多次讀取小明的賬戶余額時(shí),如果第一次讀取的是100,那么不管在這之后事務(wù)B對(duì)它進(jìn)行如何的修改,對(duì)于事務(wù)A來(lái)說(shuō)多次讀取的結(jié)果都是100??芍貜?fù)讀解決了不可重復(fù)讀(聽起來(lái)像是廢話),但是存在幻讀的情況。

幻讀:當(dāng)事務(wù)A查詢賬戶余額=100的客戶個(gè)數(shù)時(shí),假如返回的是1萬(wàn),這時(shí)事務(wù)B將小明的賬戶余額由110改為100并提交事務(wù),事務(wù)A再次查詢賬戶余額=100的客戶個(gè)數(shù)時(shí)返回的統(tǒng)計(jì)個(gè)數(shù)變成了1萬(wàn)零1。這就是幻讀。

幻讀和不可重復(fù)讀有區(qū)別。不可重復(fù)讀側(cè)重點(diǎn)在于讀取同一條數(shù)據(jù),數(shù)據(jù)被修改,如讀小明的賬戶余額;幻讀的側(cè)重點(diǎn)在于新增或者刪除 (數(shù)據(jù)條數(shù)變化),同樣的條件兩次查詢記錄數(shù)不一樣。

串行化: 上面三個(gè)隔離級(jí)別對(duì)同一條記錄的讀和寫都可以并發(fā)進(jìn)行,但是串行化的隔離級(jí)別下就只能進(jìn)行讀-讀并發(fā)。只要有一個(gè)事務(wù)操作一條記錄的寫,那么其他事務(wù)要讀這條記錄的事務(wù)都得等著。例如,事務(wù)B修改小明的賬戶還未提交前事務(wù)A來(lái)讀,那么事務(wù)A就只能等著事務(wù)B提交之后才能讀。

串行化的隔離級(jí)別一半沒人用,因?yàn)樾阅鼙容^低,常用的是已提交讀和可重復(fù)讀。
大多數(shù)數(shù)據(jù)庫(kù)采用已提交讀,MySQ的默認(rèn)隔離級(jí)別是:可重復(fù)讀。

可以通過(guò) select @@global.tx_isolation;來(lái)查看當(dāng)前隔離級(jí)別。

?不會(huì)造成  ?可能造成  
隔離級(jí)別
臟讀不可重復(fù)讀幻讀
未提交讀???
已提交讀???
可重復(fù)讀???
串行化???

上述內(nèi)容就是MySQL中有哪些事務(wù)隔離級(jí)別,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI