首頁  >  文章  >  資料庫  >  認識InnoDB MVCC如何運作

認識InnoDB MVCC如何運作

coldplay.xixi
coldplay.xixi轉載
2020-10-10 17:51:181752瀏覽

認識InnoDB MVCC如何運作

InnoDB 的 MVCC,是透過在每行記錄後面保存兩個隱藏的列來實現的。這兩個列,一個保存了行的建立時間,一個保存行的過期時間(或刪除時間)。當然儲存的不是實際的時間值,而是系統版本號碼。每開始一個新的事務,系統版本號就會自動遞增。事務開始時刻的系統版本號會作為事務的版本號,用來和查詢到的每行記錄的版本號進行比較,下面看可重複讀取隔離級別下,MVCC 具體是如何操作的。

SELECT

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

a. InnoDB只尋找版本早於目前交易版本的資料行(也就是,行的系統版本號小於或等於事務的系統版本號),這樣可以確保事務讀取的行,要么是在事務開始前已經存在的,要么是事務本身插入或者修改過的。

b. 行的刪除版本要麼未定義,要麼大於目前交易版本號。這可以確保事務讀取到的行,在事務開始之前未被刪除。

只有符合上述兩個條件的記錄,才能作為查詢結果傳回。

INSERT

InnoDB為新插入的每一行保存目前系統版本號碼作為行版本號

DELETE

InnoDB為刪除的每一行保存當前系統版本號作為行刪除標識。

UPDATE

InnoDB為插入一行新紀錄,保存目前系統版本號作為行版本號,同時保存目前系統版本號到原來的行作為行刪除標識。

儲存這兩個額外系統版本號,讓大多數讀取作業都可以不用加鎖。這樣設計使得讀取資料操作很簡單,效能很好,也能保證只會讀取符合標準的行。不足之處是每行記錄都需要額外的儲存空間,需要做更多的行檢查工作,及一些額外的維護工作。

MVCC只在 REPEATABLE READ(可重複讀取)和 READ COMMITTED(讀取提交) 這兩個隔離等級下運作。其他兩個隔離等級都和 MVCC不相容,因為READ UNCOMMITTED(讀未提交) 總是會讀取最新的資料行,而不是符合目前交易版本的資料行。而 SERIALIZABLE(串列化) 則會對所有讀取的行都加鎖。

相關學習推薦:mysql資料庫

以上是認識InnoDB MVCC如何運作的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:juejin.im。如有侵權,請聯絡admin@php.cn刪除