哪個網(wǎng)站可以做社工試題網(wǎng)絡(luò)服務(wù)器
多版本并發(fā)控制
什么是MVCC
MVCC (Multiversion Concurrency Control)多版本并發(fā)控制。顧名思義,MVCC是通過數(shù)據(jù)行的多個版本管理來實現(xiàn)數(shù)據(jù)庫的并發(fā)控制。這項技術(shù)使得在InnoDB的事務(wù)隔離級別下執(zhí)行一致性讀操作有了保證。換言之,就是為了查詢一些正在被另一個事務(wù)更新的行,并且可以看到它們被更新之前的值,這樣在做查詢的時候就不用等待另一個事務(wù)釋放鎖。
快照讀與當(dāng)前讀
再談隔離級別
MVCC 可以不采用鎖機(jī)制,而是通過樂觀鎖的方式來解決不可重復(fù)讀和幻讀問題!它可以在大多數(shù)情況下替代行級鎖,降低系統(tǒng)的開銷。
隱藏字段、Undo Log 版本鏈
MVCC實現(xiàn)原理之ReadView
MVCC的實現(xiàn)依賴于:隱藏字段、Undo log版本鏈、ReadView
什么是ReadView?
在MVCC機(jī)制中,多個事務(wù)對同一個行記錄進(jìn)行更新會產(chǎn)生多個歷史快照,這些歷史快照保存在Undo Log里**。如果一個事務(wù)想要查詢這個行記錄,需要讀取哪個版本的行記錄呢?這時就需要用到ReadView了**,它幫助我們解決了行的可見性問題。
ReadView就是事務(wù)在使用MVCC機(jī)制進(jìn)行快照讀操作時產(chǎn)生的讀視圖。當(dāng)事務(wù)啟動時,會生成數(shù)據(jù)庫系統(tǒng)當(dāng)前的一個快照,InnoDB為每個事務(wù)構(gòu)造了一個數(shù)組,用來記錄并維護(hù)系統(tǒng)當(dāng)前活躍事務(wù)的ID(“活躍”指的就是,啟動了但還沒提交)
設(shè)計思路
ReadView要解決的主要問題就是需要判斷一下版本鏈中的哪個版本是當(dāng)前事務(wù)可見的。
ReadView的規(guī)則
有了ReadView,在訪問某條記錄時,只需要按照下面的步驟判斷記錄的某個版本是否可見。
-
如果被訪問版本的trx_id屬性值與ReadView中的creator_trx_id值相同,意味著當(dāng)前事務(wù)在訪問它自己修改過的記錄,所以該版本可以被當(dāng)前事務(wù)訪問。
-
如果被訪問版本的trx_id值小于ReadView中的up_limit_id值,表明生成該版本的事務(wù)在當(dāng)前事務(wù)生成ReadView前已提交,所以該版本可以被當(dāng)前事務(wù)訪問。
-
如果被訪問版本的trx_id值大于或等于ReadView中l(wèi)ow_limit_id值,表明生成該版本的事務(wù)在當(dāng)前事務(wù)生成的ReadView后才開啟,所以該版本不可以被當(dāng)前事務(wù)訪問。
-
如果被訪問版本的trx_id值在ReadView的up_limit_id和low_limit_id之間,那就需要判斷一下trx_id屬性值是不是在trx_ids列表中。
如果在,說明創(chuàng)建ReadView時生成該版本的事務(wù)還是活躍的,該版本不可以被訪問。
如果不在,說明創(chuàng)建ReadView時生成該版本的事務(wù)已經(jīng)被提交,該版本可以被訪問。
MVCC整體操作流程
事務(wù)的隔離級別為讀已提交時,一個事務(wù)中的每一次SELECT查詢都會重新獲取一次Read View。
當(dāng)事務(wù)隔離級別為可重復(fù)讀時,就避免了不可重復(fù)讀。這是因為一個事務(wù)只在第一次SELECT的時候會獲取一次Read View,而后面的所有的SELECT都會復(fù)用這個Read view。
舉例說明
READ COMMITTED 隔離級別下
之后,把事務(wù)id為10的事務(wù)提交
這個時候再讀一次:
執(zhí)行過程分析:
REPEATABLE READ隔離級別下
如何解決幻讀?
總結(jié)
B站鏈接