什麼是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 |
InnoDB會根據以下兩個條件檢查每行記錄:
a.InnoDB只會查找版本早於當前事務版本(時間)的數據行(也就是,行的系統版本號小於或等於事務的系統版本號),這樣可以確保事務讀取的行,要麼是在事務開始前已經存在的,要麼是事務自身插入或者修改過的.
b.行的刪除版本(時間)要麼未定義,要麼大於當前事務版本號,這可以確保事務讀取到的行,在事務開始之前未被刪除.
只有a,b同時滿足的記錄,才能返回作爲查詢結果.
InnoDB會爲刪除的每一行保存當前系統的版本號(事務的ID)作爲刪除標識. 即更改刪除時間字段。
UPDATE
InnoDB執行UPDATE,實際上是新插入了一行記錄,並保存其創建時間爲當前事務的ID,同時保存當前事務ID到要UPDATE的行的刪除時間.
總述:mysql通過爲每一行記錄保存兩個隱藏的字段‘創建時間(事務ID)’,‘刪除時間(事務ID)’,通過每個事務執行的操作,對應的對這兩個字段進行更新,同時,在select時只能查詢創建時間小於當前的且刪除時間大於當前的記錄,delete只能刪除刪除時間大於當前時間的。這裏的時間都是指事務的版本號。