1. 程式人生 > >資料庫 - MySql MVVC機制

資料庫 - MySql MVVC機制

什麼是MVVC

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

MySql如何實現的MVVC

        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只能刪除刪除時間大於當前時間的。這裡的時間都是指事務的版本號。