MVCC解決幻讀

MVCC(多版本控制)解決幻讀:


image.png

當(dāng)插入的是一條新數(shù)據(jù)時(shí),記錄上對(duì)應(yīng)的回滾段指針為NULL


image.png

InnoDB的MVCC,是通過(guò)在每行紀(jì)錄后面保存兩個(gè)隱藏的列來(lái)實(shí)現(xiàn)的。這兩個(gè)列,一個(gè)保存了行的創(chuàng)建時(shí)間,一個(gè)保存了行的過(guò)期時(shí)間(或刪除時(shí)間),當(dāng)然存儲(chǔ)的并不是實(shí)際的時(shí)間值,而是系統(tǒng)版本號(hào)。每開(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)和查詢到的每行紀(jì)錄的版本號(hào)進(jìn)行比較。在REPEATABLE READ隔離級(jí)別下,MVCC具體的操作如下:

SELECT
InnoDB會(huì)根據(jù)以下兩個(gè)條件檢查每行紀(jì)錄:
InnoDB只查找版本早于當(dāng)前事務(wù)版本的數(shù)據(jù)行,即,行的系統(tǒng)版本號(hào)小于或等于事務(wù)的系統(tǒng)版本號(hào),這樣可以確保事務(wù)讀取的行,要么是在事務(wù)開(kāi)始前已經(jīng)存在的,要么是事務(wù)自身插入或者修改過(guò)的。
行的刪除版本,要么未定義,要么大于當(dāng)前事務(wù)版本號(hào)。這樣可以確保事務(wù)讀取到的行,在事務(wù)開(kāi)始之前未被刪除。
只有符合上述兩個(gè)條件的紀(jì)錄,才能作為查詢結(jié)果返回。
INSERT
InnoDB為插入的每一行保存當(dāng)前系統(tǒng)版本號(hào)作為行版本號(hào)。
DELETE
InnoDB為刪除的每一行保存當(dāng)前系統(tǒng)版本號(hào)作為行刪除標(biāo)識(shí)。
UPDATE
InnoDB為插入一行新紀(jì)錄,保存當(dāng)前系統(tǒng)版本號(hào)作為行版本號(hào),同時(shí),保存當(dāng)前系統(tǒng)版本號(hào)到原來(lái)的行作為行刪除標(biāo)識(shí)。

?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

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