分布式事務(wù)(1)事務(wù)的ACID和隔離級(jí)別

1.1 事務(wù)的ACID

Atomic:原子性,一堆SQL,要么都成功,要么都不執(zhí)行,不允許一部分SQL執(zhí)行成功,一部分SQL執(zhí)行失敗。

Consistency:一致性,在一堆SQL執(zhí)行之前,數(shù)據(jù)必須是正確的,執(zhí)行之后,數(shù)據(jù)也必須是準(zhǔn)確的。

Isolation:隔離性,多個(gè)事務(wù)在跑的時(shí)候不能互相干擾,不要事務(wù)A操作數(shù)據(jù)還未完成,事務(wù)B也來(lái)操作這個(gè)數(shù)據(jù),導(dǎo)致事務(wù)A的操作出錯(cuò)。

Durability:持久性,事務(wù)成功了,就必須永久對(duì)數(shù)據(jù)的修改是有效的,不能過(guò)一段時(shí)間數(shù)據(jù)自己就沒(méi)了。

1.2 事務(wù)隔離級(jí)別

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

讀未提交(Read Uncommitted):某個(gè)事務(wù)還沒(méi)提交的時(shí)候,修改的數(shù)據(jù),就讓別的事務(wù)給讀到了,這很容易導(dǎo)致出錯(cuò)的,這個(gè)也叫做臟讀。


讀未提交.png

讀已提交(Read Committed 不可重復(fù)讀):事務(wù)A在跑的時(shí)候, 先查詢了一個(gè)數(shù)據(jù)是值1,然后過(guò)了段時(shí)間,事務(wù)B把那個(gè)數(shù)據(jù)給修改為2還提交了,此時(shí)事務(wù)A再次查詢這個(gè)數(shù)據(jù)就成了值2了。這個(gè)也叫做不可重復(fù)讀,就是所謂的一個(gè)事務(wù)內(nèi)對(duì)一個(gè)數(shù)據(jù)兩次讀,可能會(huì)讀到不一樣的值。


讀已提交.png

可重復(fù)讀(Read Repeatable):事務(wù)A在執(zhí)行過(guò)程中,對(duì)某個(gè)數(shù)據(jù)的值,無(wú)論讀多少次都是值1;哪怕這個(gè)過(guò)程中事務(wù)B修改了數(shù)據(jù)的值還提交了,但是事務(wù)A讀到的還是自己事務(wù)開(kāi)始時(shí)這個(gè)數(shù)據(jù)的值。


可重復(fù)讀.png

幻讀:不可重復(fù)讀和可重復(fù)讀都是針對(duì)兩個(gè)事務(wù)同時(shí)對(duì)某條數(shù)據(jù)在修改,幻讀針對(duì)的是插入,比如某個(gè)事務(wù)把所有行的某個(gè)字段都修改為了2,結(jié)果另外一個(gè)事務(wù)插入了一條數(shù)據(jù),那個(gè)字段的值是1。第一個(gè)事務(wù)會(huì)突然發(fā)現(xiàn)多出來(lái)一條數(shù)據(jù),那個(gè)數(shù)據(jù)的字段是1。如果要解決幻讀,就需要使用串行化級(jí)別的隔離級(jí)別,所有事務(wù)都串行起來(lái),不允許多個(gè)事務(wù)并行操作。


幻讀.png

串行化:


串行化.png

1.3 Mysql的隔離級(jí)別實(shí)現(xiàn)原理

MySQL的默認(rèn)隔離級(jí)別是可重復(fù)讀(Read Repeatable),就是說(shuō)每個(gè)事務(wù)都會(huì)開(kāi)啟一個(gè)自己要操作的某個(gè)數(shù)據(jù)的快照,事務(wù)期間,讀到的都是這個(gè)數(shù)據(jù)的快照,對(duì)一個(gè)數(shù)據(jù)的多次讀都是一樣的。

實(shí)現(xiàn)原理:多版本并發(fā)控制(multi-version concurrency control)

innodb存儲(chǔ)引擎,會(huì)在每行數(shù)據(jù)的最后加兩個(gè)隱藏列,一個(gè)保存行的創(chuàng)建時(shí)間,一個(gè)保存行的刪除時(shí)間,但是這存放的不是時(shí)間,而是事務(wù)id,事務(wù)id是mysql自己維護(hù)的自增的,全局唯一。

滿足:創(chuàng)建事務(wù)id <= 當(dāng)前事務(wù)id,當(dāng)前事務(wù)id < 刪除事務(wù)id。

image.png

事務(wù)id=121的事務(wù),查詢id=1,得到name=張三的數(shù)據(jù)。

事務(wù)id=123的事務(wù),查詢id=1,不能得到name=張三的數(shù)據(jù)。

事務(wù)id=121的事務(wù),查詢id=2,得到name=李四的數(shù)據(jù)。

事務(wù)id=124的事務(wù),查詢id=2,得到name=小李四的數(shù)據(jù)。

最后編輯于
?著作權(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),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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