????????InnoDB支持事務(wù)荚板,其它的引擎不支持事務(wù)欠啤。
1哗咆、事務(wù)并發(fā)問(wèn)題
????????多事務(wù)并行帶來(lái)的3個(gè)問(wèn)題:
????????1)臟讀。事務(wù)A讀到了事務(wù)B寫(xiě)入但是還沒(méi)有commit的數(shù)據(jù)猾担。
? ? ? ? 2)不可重復(fù)讀袭灯。事務(wù)A先后讀到了事務(wù)B沒(méi)提交前、提交后的數(shù)據(jù)绑嘹,兩份數(shù)據(jù)不一樣稽荧。
? ? ? ? 3)幻讀。事務(wù)A先后讀到了事物B沒(méi)插入數(shù)據(jù)前工腋,和插入數(shù)據(jù)提交后數(shù)據(jù)姨丈。
2畅卓、事務(wù)隔離級(jí)別
????????多事務(wù)并行問(wèn)題的解決方法,通過(guò)設(shè)置事務(wù)隔離級(jí)別來(lái)解決:
? ? ? ? 1)不提交讀蟋恬。不提交就讀取翁潘,這種隔離級(jí)別三個(gè)問(wèn)題都解決不了;
? ? ? ? 2)提交讀歼争。事務(wù)B提交了以后拜马,事務(wù)A才能讀,這種隔離級(jí)別解決了臟讀的問(wèn)題沐绒;
? ? ? ? 3)可重復(fù)讀俩莽。一個(gè)事務(wù)執(zhí)行過(guò)程中,看到的數(shù)據(jù)都是一樣的乔遮。這種隔離級(jí)別解決了臟讀和不可重復(fù)讀的問(wèn)題扮超;
? ? ? ? 4)序列化讀。一個(gè)事務(wù)執(zhí)行時(shí)蹋肮,加了全表數(shù)據(jù)的行鎖和間隙鎖出刷,其它事務(wù)等鎖解鎖以后,才能讀括尸。
3巷蚪、MVCC
????????事務(wù)實(shí)現(xiàn)MVCC的過(guò)程:
? ? ? ? 1)每個(gè)事務(wù)都有一個(gè)事務(wù)ID病毡;
? ? ? ? 2)事務(wù)開(kāi)始的時(shí)候濒翻,會(huì)找到當(dāng)前已提交的最大的事務(wù)ID(事務(wù)ID是自動(dòng)遞增的),作為這個(gè)事務(wù)的一致性讀視圖的事務(wù)ID啦膜;
? ? ? ? 3)事務(wù)在更改一行數(shù)據(jù)時(shí)有送,會(huì)把更改前的數(shù)據(jù)和之前的ROW事務(wù)ID放到undo log里面,再把更改后的數(shù)據(jù)和更改的事務(wù)ID放到Undo log里面僧家;
? ? ? ? 4)事務(wù)在查詢(xún)行數(shù)據(jù)時(shí)雀摘,如果這行數(shù)據(jù)是事務(wù)一致性讀視圖的事務(wù)ID之前動(dòng)過(guò)的數(shù)據(jù),那么直接讀劝斯啊阵赠;如果是之后的數(shù)據(jù),說(shuō)明之后又有其它事務(wù)動(dòng)過(guò)這行數(shù)據(jù)了肌稻,我們只取一致性讀視圖的行數(shù)據(jù)清蚀,不取新的數(shù)據(jù),所以我們根據(jù)undo log來(lái)算出一致性讀視圖的數(shù)據(jù)爹谭,返回枷邪。
4、RR與RC使用MVCC
????????4個(gè)事務(wù)隔離級(jí)別诺凡,只有RR與RC使用了MVCC东揣。
????????快照讀時(shí)践惑,RR事務(wù)內(nèi)一致性讀視圖的事務(wù)ID不會(huì)變,一直是最開(kāi)始那個(gè)嘶卧,所以實(shí)現(xiàn)了不可重復(fù)讀尔觉;RC事務(wù)內(nèi)每次讀的時(shí)候,都會(huì)把一致性讀視圖的事務(wù)ID更改成最新提交的事務(wù)的事務(wù)ID脸候,所以就不能做到不可重復(fù)讀穷娱。
????????當(dāng)前讀時(shí),RR使用next-key lock來(lái)避免幻讀运沦,而RC因?yàn)闆](méi)有GAP鎖泵额,所以不能避免。
5携添、快照讀與當(dāng)前讀
????????這兩個(gè)概念只會(huì)在MVCC里面才存在嫁盲。
????????快照讀是指讀的是MVCC生成的read view,而不是真實(shí)最新的數(shù)據(jù)烈掠,read view不是一份真實(shí)的數(shù)據(jù)羞秤,而是根據(jù)當(dāng)前最新的數(shù)據(jù)和undo log計(jì)算出來(lái)的。
????????當(dāng)前讀是指直接讀當(dāng)前最新的數(shù)據(jù)左敌。
6瘾蛋、長(zhǎng)事務(wù)
????????Mysql應(yīng)當(dāng)盡量避免長(zhǎng)事務(wù),長(zhǎng)事務(wù)會(huì)帶來(lái)很多危害:
? ? ? ? 1)二階段鎖矫限,只有等事務(wù)提交才能釋放鎖哺哼,長(zhǎng)事務(wù)會(huì)導(dǎo)致鎖資源的阻塞;
? ? ? ? 2)事務(wù)過(guò)程中會(huì)生成undo log叼风,過(guò)長(zhǎng)的的事務(wù)會(huì)生成大量的undo log取董,影響快照讀的執(zhí)行效率;
? ? ? ? 3)事務(wù)過(guò)程中會(huì)生成大量的bin log无宿,這些Binlog等commit的時(shí)候才會(huì)傳輸給從庫(kù)茵汰,長(zhǎng)事務(wù)會(huì)導(dǎo)致主從庫(kù)延遲太大。
7孽鸡、事務(wù)隱式提交
????????mysql的事務(wù)會(huì)有隱式提交的情況蹂午,具體為:
????????在一個(gè)事務(wù)當(dāng)中,執(zhí)行ddl操作彬碱,會(huì)隱式地提交事務(wù)豆胸。
????????因此,dml操作和ddl操作造成不要寫(xiě)在一個(gè)事務(wù)里堡妒,不然這個(gè)事務(wù)就有問(wèn)題了配乱,不再是一個(gè)事務(wù),沒(méi)法回滾。