21、多版本并發(fā)控制(MVCC)
1诡宗、概念
MVCC是行級(jí)鎖的一個(gè)變種滔蝉,但是它在很多情況下避免了加鎖操作,因此開(kāi)銷更低塔沃。
MVCC的實(shí)現(xiàn)蝠引,是通過(guò)保存數(shù)據(jù)在某個(gè)時(shí)間點(diǎn)的快照來(lái)實(shí)現(xiàn)的。也就是說(shuō),不管需要執(zhí)行多長(zhǎng)時(shí)間螃概,每個(gè)事務(wù)看到的數(shù)據(jù)都是一致的矫夯。根據(jù)事務(wù)開(kāi)始的時(shí)間不同,每個(gè)事務(wù)對(duì)同一張表吊洼,同一時(shí)刻看到的數(shù)據(jù)都可能是不同的训貌。
2、InnoDB中MVCC的實(shí)現(xiàn)
InnoDB 的MVCC是通過(guò)每行記錄后面保存兩個(gè)隱藏的列來(lái)實(shí)現(xiàn)的冒窍。這兩個(gè)列递沪,一個(gè)是保存了行的創(chuàng)建時(shí)間,一個(gè)保存了行的過(guò)期時(shí)間综液,當(dāng)然存儲(chǔ)的并不是實(shí)際的時(shí)間值区拳,而是系統(tǒng)版本號(hào)(system version number)。每開(kāi)始一個(gè)新的事務(wù)意乓,系統(tǒng)版本號(hào)會(huì)自動(dòng)遞增樱调。事務(wù)開(kāi)始時(shí)刻的系統(tǒng)版本號(hào)會(huì)作為事務(wù)的版本號(hào),用來(lái)和查詢到的每行記錄的版本號(hào)進(jìn)行比較届良。
在REPEATABLE READ(可重復(fù)讀)隔離級(jí)別下笆凌,MVCC的具體操作:
(1)SELECT
a:InnoDB只查找版本早于當(dāng)前事務(wù)版本的數(shù)據(jù)行,這樣就可以保證事務(wù)讀取的行士葫,要么是事務(wù)開(kāi)啟之前就已經(jīng)存在的乞而,要么事務(wù)自身插入或修改的。
b:行的刪除版本要么未定義慢显,要么大于當(dāng)前事務(wù)版本號(hào)爪模。這可以確保事務(wù)讀取到的行,在事務(wù)開(kāi)始之前未被刪除荚藻。
(2)INSERT
InnoDB 為新插入的每一行保存當(dāng)前系統(tǒng)版本號(hào)作為行版本號(hào)屋灌。
(3)DELETE
InnoDB 為刪除的每一行保存當(dāng)前系統(tǒng)版本號(hào)作為行刪除版本。
(4)UPDATE
InnoDB 為插入一行新記錄应狱,保存當(dāng)前系統(tǒng)版本號(hào)作為行版本號(hào)共郭,同時(shí)保存當(dāng)前系統(tǒng)版本號(hào)到原來(lái)的行作為行刪除標(biāo)識(shí)。
3疾呻、優(yōu)缺點(diǎn)
優(yōu)點(diǎn):
(1)大部分讀操作都可以不用加鎖
(2)讀數(shù)據(jù)操作很簡(jiǎn)單除嘹,性能很好
(3)能保證只會(huì)讀取到符合標(biāo)準(zhǔn)的行
缺點(diǎn):
(1)每行記錄都要額外的空間來(lái)維護(hù)這兩個(gè)字段
(2)需要做更多的行檢查工作,以及一些額外工作