淺談MySQL事務(wù)特性與隔離級(jí)別

一、知識(shí)結(jié)構(gòu)腦圖

下面是我對(duì)事務(wù)知識(shí)總計(jì)的腦圖,也是事務(wù)的主要內(nèi)容,事務(wù)的特性,事務(wù)的實(shí)現(xiàn)以及事務(wù)的隔離級(jí)別

二、事務(wù)的基本特性(ACID)

定義

1.原子性(Atomicity):事務(wù)開始后所有操作,要么全部做完,要么全部不做,不可能停滯在中間環(huán)節(jié)。事務(wù)執(zhí)行過程中出錯(cuò),會(huì)回滾到事務(wù)開始前的狀態(tài),所有的操作就像沒有發(fā)生一樣。也就是說事務(wù)是一個(gè)不可分割的整體,就像化學(xué)中學(xué)過的原子,是物質(zhì)構(gòu)成的基本單位。

2.一致性(Consistency):事務(wù)開始前和結(jié)束后,數(shù)據(jù)庫的完整性約束沒有被破壞。包括一致性讀和一致性寫。比如A向B轉(zhuǎn)賬,不可能A扣了錢,B卻沒收到。

3.隔離性(Isolation):同一時(shí)間,只允許一個(gè)事務(wù)請(qǐng)求同一數(shù)據(jù),不同的事務(wù)之間彼此沒有任何干擾。比如A正在從一張銀行卡中取錢,在A取錢的過程結(jié)束前,B不能向這張卡轉(zhuǎn)賬。

4.持久性(Durability):事務(wù)完成后,事務(wù)對(duì)數(shù)據(jù)庫的所有更新將被保存到數(shù)據(jù)庫,不能回滾。

目的

為數(shù)據(jù)庫提供了一個(gè)從失敗中恢復(fù)到正常狀態(tài)的方法,同時(shí)提供了數(shù)據(jù)庫在異常狀態(tài)下仍保持一致性的方法

為多個(gè)應(yīng)用程序在并發(fā)訪問數(shù)據(jù)庫時(shí),可以在這些應(yīng)用程序之間提供一個(gè)隔離的方法,以防止彼此之間的操作相互干擾

成功的情況下

能夠?qū)?shù)據(jù)從一種狀態(tài)變?yōu)榱硪环N狀態(tài),并且能夠持久化

異常情況下

能將數(shù)據(jù)恢復(fù)到正常狀態(tài)

要能夠保持一致性,包含數(shù)據(jù)的一致性和約束的一致性

并發(fā)的情況下

并發(fā)的操作之間不會(huì)產(chǎn)生影響

總結(jié):事務(wù)的目的就是要提供3種方法:失敗恢復(fù)的方法保持一致的方法,操作隔離的方法

三、事務(wù)的并發(fā)問題

臟讀:事務(wù)A讀取了事務(wù)B更新的數(shù)據(jù),然后B回滾操作,那么A讀取到的數(shù)據(jù)是臟數(shù)據(jù)

不可重復(fù)讀:事務(wù) A 多次讀取同一數(shù)據(jù),事務(wù) B 在事務(wù)A多次讀取的過程中,對(duì)數(shù)據(jù)作了更新并提交,導(dǎo)致事務(wù)A多次讀取同一數(shù)據(jù)時(shí),結(jié)果 不一致。

幻讀:系統(tǒng)管理員A將數(shù)據(jù)庫中所有學(xué)生的成績從具體分?jǐn)?shù)改為ABCDE等級(jí),但是系統(tǒng)管理員B就在這個(gè)時(shí)候插入了一條具體分?jǐn)?shù)的記錄,當(dāng)系統(tǒng)管理員A改結(jié)束后發(fā)現(xiàn)還有一條記錄沒有改過來,就好像發(fā)生了幻覺一樣,這就叫幻讀。

不可重復(fù)讀和幻讀的區(qū)別

很多人容易搞混不可重復(fù)讀和幻讀,確實(shí)這兩者有些相似。但不可重復(fù)讀重點(diǎn)在于update和delete,而幻讀的重點(diǎn)在于insert。如果使用鎖機(jī)制來實(shí)現(xiàn)這兩種隔離級(jí)別,在可重復(fù)讀中,該sql第一次讀取到數(shù)據(jù)后,就將這些數(shù)據(jù)加鎖,其它事務(wù)無法修改這些數(shù)據(jù),就可以實(shí)現(xiàn)可重復(fù) 讀了。但這種方法卻無法鎖住insert的數(shù)據(jù),所以當(dāng)事務(wù)A先前讀取了數(shù)據(jù),或者修改了全部數(shù)據(jù),事務(wù)B還是可以insert數(shù)據(jù)提交,這時(shí)事務(wù)A就會(huì) 發(fā)現(xiàn)莫名其妙多了一條之前沒有的數(shù)據(jù),這就是幻讀,不能通過行鎖來避免。需要Serializable隔離級(jí)別 ,讀用讀鎖,寫用寫鎖,讀鎖和寫鎖互斥,這么做可以有效的避免幻讀、不可重復(fù)讀、臟讀等問題,但會(huì)極大的降低數(shù)據(jù)庫的并發(fā)能力。

四、MySQL事務(wù)隔離級(jí)別

隔離級(jí)別越低,事務(wù)請(qǐng)求的鎖越少或者保持鎖的時(shí)間就越短。這也就是大多數(shù)數(shù)據(jù)庫的隔離級(jí)別是READ COMMITTED的原因,MySQL的默認(rèn)隔離級(jí)別就是Repeatable-Read。

MySQL8.0事務(wù)隔離級(jí)別為:

REPEATABLE-READ??

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容