數據庫 - MySql MVCC機制

什麼是MVCC

        MVCC:是一種多版本併發控制(MVCC,Multiversion Currency Control)。一般情況下,事務性儲存引擎不是隻使用表鎖,行加鎖的處理數據,而是同時結合了MVCC機制,以處理更多的併發問題。當然Mysql中Innodb引擎才支持。

MySql如何實現的MVCC

        InnoDB的MVCC,是通過在每行記錄後面保存兩個隱藏的列來實現的,這兩個列,分別保存了這個行的創建時間,一個保存的是行的刪除時間。這裏存儲的並不是實際的時間值,而是系統版本號(可以理解爲事務的ID),沒開始一個新的事務,系統版本號就會自動遞增,事務開始時刻的系統版本號會作爲事務的ID.     

insert語句後其實對應在數據中的表如下(後面兩列是隱藏列,我們通過查詢語句並看不到)

id name 創建時間(事務ID) 刪除時間(事務ID)
1 a 1 undefined
2

b

1 undefined
3 c 1 undefined

SELECT

InnoDB會根據以下兩個條件檢查每行記錄: 
a.InnoDB只會查找版本早於當前事務版本(時間)的數據行(也就是,行的系統版本號小於或等於事務的系統版本號),這樣可以確保事務讀取的行,要麼是在事務開始前已經存在的,要麼是事務自身插入或者修改過的. 
b.行的刪除版本(時間)要麼未定義,要麼大於當前事務版本號,這可以確保事務讀取到的行,在事務開始之前未被刪除. 
只有a,b同時滿足的記錄,才能返回作爲查詢結果.

DELETE

InnoDB會爲刪除的每一行保存當前系統的版本號(事務的ID)作爲刪除標識. 即更改刪除時間字段。

UPDATE

InnoDB執行UPDATE,實際上是新插入了一行記錄,並保存其創建時間爲當前事務的ID,同時保存當前事務ID到要UPDATE的行的刪除時間.

 

總述:mysql通過爲每一行記錄保存兩個隱藏的字段‘創建時間(事務ID)’,‘刪除時間(事務ID)’,通過每個事務執行的操作,對應的對這兩個字段進行更新,同時,在select時只能查詢創建時間小於當前的且刪除時間大於當前的記錄,delete只能刪除刪除時間大於當前時間的。這裏的時間都是指事務的版本號。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章