innodb的MVCC是通過在每行記錄後面儲存兩個隐藏的列來實作。一個儲存行的建立時間,一個儲存行的過期時間,存儲的值為系統版本号。每開啟一個新的事務,系統版本号都會自動增加。在repeatable read隔離級别下,MVCC的具體操作:
select
innodb會根據以下兩個條件檢查每行記錄:
innodb隻查找版本早于目前事務版本的資料行。
行删除版本要麼未定義,要麼大于目前事務版本号
insert
innodb為新插入的每一行儲存目前系統版本号作為行版本号
delete
innodb為删除每一行儲存目前系統版本号作為行删除辨別
update
innodb為插入一行新紀錄,儲存目前系統版本号為行版本号,同時儲存目前系統版本号為原來行删除辨別
儲存這兩個額外系統版本号,使大多數讀操作都可以不用加鎖。但是會增加額外的存儲空間,需要做更多的行檢查和額外的維護工作
MVCC隻在repeatable read和read committed兩個隔離級别工作。read uncommitted總是讀取最新資料。serializable則會對所有讀取的行都加鎖