MySQL的多版本併發控制MVCC

2021-09-25 15:52:29 字數 1256 閱讀 5995

mvcc,multi-version concurrency control 多版本併發控制,mvcc 是一種併發控制的方法,一般在資料庫管理系統中,實現對資料庫的併發訪問;在程式語言中實現事務記憶體。

這次我講的主要是mysql的mvcc的實現,基於mysql的事務儲存引擎。mysql大多數事務型儲存引擎的實現的都不是簡單的行級鎖。基於提公升併發效能的考慮,他們一般都實現了多版本併發控制(mvcc)。當然oracle,postgresql等其他資料庫也都實現了mvcc,只是實現機制不同。

mvcc的實現,是同步儲存資料在某個時間點的快照來實現的。也就是說,不管需要執行多長時間,每個事務看到的資料都是一致的。根據事務開始的時間不同,每個事務對同一張表,同一時刻看到的資料可能是不一樣的。

這裡主要說下inoodb的mvcc,是通過在每行記錄後面儲存兩個隱藏的列來實現。這兩個列,乙個儲存了行的建立時間,乙個儲存行的過期時間(或刪除時間)。當然儲存的並不是實際的時間值。而是系統版本號。沒開始乙個新的事務,系統版本號都會自動遞增。事務開始時刻的系統版本號會作為事務的版本號,用來和查詢到的每行記錄的版本號進行比較。下面看一下在repeatable read (可重複讀)隔離級別下(如果不清楚隔離級別的小夥伴可以搜尋一下mysql的隔離級別),mvcc具體是如何操作的。

select

對於select語句,只有同時滿足了下面兩個條件的行,才能被返回:

insert

對新插入的行,行的更新版本被修改為該事務的事務號

delete

對於刪除,innodb直接把該行的被刪除版本號設定為當前的事務號,相當於標記為刪除,而不是實際刪除

update

在更新行的時候,innodb會把原來的行複製乙份到回滾段中,並把當前的事務號作為該行的更新版本

mvcc優缺點

上述策略的結果就是,在讀取資料的時候,innodb幾乎不用獲得任何鎖, 每個查詢都通過版本檢查,只獲得自己需要的資料版本,從而大大提高了系統的併發度。

這種策略的缺點是,為了實現多版本,innodb必須對每行增加相應的字段來儲存版本資訊,同時需要維護每一行的版本資訊,而且在檢索行的時候,需要進行版本的比較,因而降低了查詢的效率;innodb還必須定期清理不再需要的行版本,及時**空間,這也增加了一些開銷

總結     mvcc只在repeatable read(可重複度)read committed(提交讀)兩個隔離級別下工作。其他兩個隔離級別都和mvcc不相容。read uncommitted(未提交讀)總是讀取最新的資料行,不符合當前事務版本的資料行。serializable(可序列化)則會對所有讀取的行都加鎖

Mysql多版本併發控制

mysql的絕大多數事務型儲存引擎都不是簡單的行級鎖。他們實現了多版本的併發控制,也就是mvvc,當然,支援mvvc的資料庫並不只有mysql,orcale postgresql等都實現了mvvc,只不過他們實現的方式不同而已,因為mvvc沒有乙個統一的規範。其實mvvc可以理解為行級鎖的一種變異,...

MySQL 架構 多版本併發控制

大部分的mysql的儲存引擎,比如innodb,falcon,以及pbxt並不是簡簡單單的使用行鎖機制。它們都使用了行鎖結合一種提高併發的技術,被稱為mvcc 多版本併發控制 mvcc並不單單應用在mysql中,其他的資料庫如oracle,postgresql,以及其他資料庫也使用這個技術。mvcc...

mysql多版本併發控制MVCC

innodb的mvcc是通過在每行記錄的後面儲存兩個隱藏的列來實現的,這兩個列乙個儲存行的建立時間,乙個儲存行的過期時間。但是並不是儲存時間而是儲存版本號,每開始乙個新的事務,版本號會自動遞增。事務開始時刻的系統版本號會作為事務的版本號,用來和查詢到每行記錄的版本號進行比較。select innod...