InnoDB 的 MVCC,是透過在每行記錄後面保存兩個隱藏的列來實現的。這兩個列,一個保存了行的建立時間,一個保存行的過期時間(或刪除時間)。當然儲存的不是實際的時間值,而是系統版本號碼。每開始一個新的事務,系統版本號就會自動遞增。事務開始時刻的系統版本號會作為事務的版本號,用來和查詢到的每行記錄的版本號進行比較,下面看可重複讀取隔離級別下,MVCC 具體是如何操作的。
InnoDB會根據以下兩個條件檢查每行記錄
a. InnoDB只尋找版本早於目前交易版本的資料行(也就是,行的系統版本號小於或等於事務的系統版本號),這樣可以確保事務讀取的行,要么是在事務開始前已經存在的,要么是事務本身插入或者修改過的。
b. 行的刪除版本要麼未定義,要麼大於目前交易版本號。這可以確保事務讀取到的行,在事務開始之前未被刪除。
只有符合上述兩個條件的記錄,才能作為查詢結果傳回。
InnoDB為新插入的每一行保存目前系統版本號碼作為行版本號
InnoDB為刪除的每一行保存當前系統版本號作為行刪除標識。
InnoDB為插入一行新紀錄,保存目前系統版本號作為行版本號,同時保存目前系統版本號到原來的行作為行刪除標識。
儲存這兩個額外系統版本號,讓大多數讀取作業都可以不用加鎖。這樣設計使得讀取資料操作很簡單,效能很好,也能保證只會讀取符合標準的行。不足之處是每行記錄都需要額外的儲存空間,需要做更多的行檢查工作,及一些額外的維護工作。
MVCC只在 REPEATABLE READ(可重複讀取)和 READ COMMITTED(讀取提交) 這兩個隔離等級下運作。其他兩個隔離等級都和 MVCC不相容,因為READ UNCOMMITTED(讀未提交) 總是會讀取最新的資料行,而不是符合目前交易版本的資料行。而 SERIALIZABLE(串列化) 則會對所有讀取的行都加鎖。
相關學習推薦:mysql資料庫
以上是認識InnoDB MVCC如何運作的詳細內容。更多資訊請關注PHP中文網其他相關文章!