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è)也叫做臟讀。

讀已提交(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ì)讀到不一樣的值。

可重復(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ù)讀和可重復(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ù)并行操作。

串行化:

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。

事務(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ù)。