MVCC實現過程

2021-10-25 19:40:25 字數 1130 閱讀 3826

參考:

解決問題髒讀、不可重複讀,因此一般用於rc和rr級別。

重點:

1、每行新增兩個隱藏字段,乙個表示最近更新此記錄的事務id,稱:data_trx_id,乙個表示該行的回滾段,稱:data_roll_ptr。(事務id為int型別,回滾段為指標型別,它指向undo log中的記錄。)

2、undo log鏈。undolog鏈為鍊錶,存放著被修改的行的歷史版本。

3、當前資料表快照 read view,快照是儲存了當前活躍事務的列表。

步驟:

1、首先要組織undo log。

執行首次更新、插入或者刪除的時候會獲得乙個有資料庫引擎分配的事務id號。然後對被修改的行進行加鎖,然後將對應行資料拷貝到undo log日誌中,再在表中新建一行,其中事務id欄位對應當前事務id,回滾指標指向undo log鏈中的資料。這樣就將新記錄與舊紀錄聯絡起來了,事務id也將其區分開了,就具備了回溯操作的條件。

2、生成read view快照

在事務中執行select方法的時候會生成read view快照,read view是當前資料庫中所有活躍的事務構成的列表。不管是rr還是rc隔離級別根據readview進行處理的方法是一致的:

上面的一致處理保證了讀取到的資料都是已經提交了的執行緒所修改的資料。不同的地方在於rr隔離級別還要保證可重複讀,其實更清晰的意思就是每次讀取的資料都是同乙個事務所修改的!因為在對readview的資料讀取的處理中,能夠讀取哪個版本的資料都依賴於區間的最小值,也就是說想讀取同乙個版本的資料,區間的最小值不能動。基本此,可以改變rc和rr級別的readview獲取方式:

1、第一種是表示事務id只有在執行插入、刪除或更新操作的時候才會分配事務id,因此例子中的a事務生成快照的時候列表為空,不會出現什麼行資料的id大於列表的最大值。

2、第二種是表示列表儲存的根本不止是活躍事務的id區間,區間的最大值要延伸到分配給下乙個事務的id,也就是最新的id,所以就能保證··· 我覺得有問題,刪了 = =, 理由:

mvcc原理 MVCC 原理

mvcc 原理 簡單說,讀了一條未提交的資料 乙個事務讀取了另外乙個事務修改後記錄 強調的是 update 和delete 只需要鎖住滿足條件的記錄即可 乙個事務讀取了另外乙個事務插入的資料,強調的是 insert 要鎖住滿足條件及相近的記錄。mysql 中預設的隔離級別是可重複讀,可解決髒讀和不可...

MySQL Innodb的MVCC實現原理

mvcc是multi version concurrency control的縮寫,也就是多版本併發控制。大家都知道,事務的隔離可以通過行鎖來實現。在開啟事務時,對操作記錄加行鎖,事務結束時釋放鎖。但是這樣加鎖會降低事務的併發量,並且對執行緒的阻塞和恢復操作也會損耗效能。那種在事務中使用了selec...

Mysql 的 MVCC 實現原理

mysql 中mvcc 實現原理,可翻看原始碼檢視 1個6byte的 db trx id標識 該行insert或者update操作的最新事務id,刪除操作也被當作乙個update操 作 用1個bit表示刪除 1個7byte的db roll ptr,指向寫到rollback segment的一條und...