MVCC原理
一致性的非鎖定讀是指在innodb存儲(chǔ)引擎通過(guò)多版本控制的方式來(lái)讀取當(dāng)前執(zhí)行時(shí)間數(shù)據(jù)庫(kù)中行的數(shù)據(jù)。如果讀取的行正在執(zhí)行修改或者刪除,此時(shí)的讀操作也不會(huì)等待鎖的釋放。相反此時(shí)回去讀取行的一個(gè)快照员辩。
快照數(shù)據(jù)其實(shí)就是undo操作產(chǎn)生的,一行記錄可能不止一個(gè)快照,所以稱(chēng)這種技術(shù)為多版本并發(fā)控制痊银。
通過(guò)read view 來(lái)判斷行記錄是否可見(jiàn)
RR隔離級(jí)別下,在每個(gè)事務(wù)開(kāi)始的時(shí)候施绎,會(huì)將當(dāng)前系統(tǒng)中的所有的活躍事務(wù)拷貝到一個(gè)列表中(read view)
RC隔離級(jí)別下溯革,在事務(wù)中的每個(gè)語(yǔ)句開(kāi)始時(shí),會(huì)將當(dāng)前系統(tǒng)中的所有的活躍事務(wù)拷貝到一個(gè)列表中(read view)
在read view中最早的事務(wù)ID為tmin粘姜,最晚的事務(wù)ID為tmax
MVCC使用場(chǎng)景
分析一下看結(jié)果:
- 當(dāng)使用read-committed時(shí)鬓照,session2 第一次返回的結(jié)果為10,第二個(gè)結(jié)果為20
- 當(dāng)使用repeatable-read時(shí)孤紧,seesion2 第一次返回的結(jié)果為10豺裆,第二次結(jié)果也為10
主要造成的原因是因?yàn)椋簉c和rr隔離級(jí)別不同,read-view 也不相同。
- rc的隔離級(jí)別臭猜,在事務(wù)中的每個(gè)語(yǔ)句開(kāi)始時(shí)躺酒,會(huì)將當(dāng)前系統(tǒng)中的所有的活躍事務(wù)拷貝到一個(gè)列表中(read view) ,第一次select的時(shí)候有session 和session2,undolog可以找到10蔑歌;當(dāng)session commit之后甜紫,新的read-view只有session,undolog可以找到的只有20单鹿。
- rr的隔離級(jí)別乐尊,在每個(gè)事務(wù)開(kāi)始的時(shí)候,會(huì)將當(dāng)前系統(tǒng)中的所有的活躍事務(wù)拷貝到一個(gè)列表中(read view),第一次的時(shí)候有session 和session2劫灶,undolog可以找到10裸违;當(dāng)session commit之后,read-view里面的活躍事物不變本昏,undolog還是可以找到10供汛。
MVCC的好處
MVCC使得數(shù)據(jù)庫(kù)讀不會(huì)對(duì)數(shù)據(jù)加鎖,普通的SELECT請(qǐng)求不會(huì)加鎖涌穆,提高了數(shù)據(jù)庫(kù)的并發(fā)處理能力怔昨;
借助MVCC,數(shù)據(jù)庫(kù)可以實(shí)現(xiàn)RC宿稀,RR等隔離級(jí)別趁舀,用戶(hù)可以查看當(dāng)前數(shù)據(jù)的前一個(gè)或者前幾個(gè)歷史版本。保證了ACID中的I特性(隔離性)原叮。