天天看點

innoDB的MVCC實作方式

innodb的MVCC是通過在每行記錄後面儲存兩個隐藏的列來實作。一個儲存行的建立時間,一個儲存行的過期時間,存儲的值為系統版本号。每開啟一個新的事務,系統版本号都會自動增加。在repeatable read隔離級别下,MVCC的具體操作:

select

innodb會根據以下兩個條件檢查每行記錄:

innodb隻查找版本早于目前事務版本的資料行。

行删除版本要麼未定義,要麼大于目前事務版本号

insert

innodb為新插入的每一行儲存目前系統版本号作為行版本号

delete

innodb為删除每一行儲存目前系統版本号作為行删除辨別

update

innodb為插入一行新紀錄,儲存目前系統版本号為行版本号,同時儲存目前系統版本号為原來行删除辨別

儲存這兩個額外系統版本号,使大多數讀操作都可以不用加鎖。但是會增加額外的存儲空間,需要做更多的行檢查和額外的維護工作

MVCC隻在repeatable read和read committed兩個隔離級别工作。read uncommitted總是讀取最新資料。serializable則會對所有讀取的行都加鎖