MVCC(多版本併發控制)

2021-10-02 09:58:07 字數 1351 閱讀 1783

mvcc是資料庫鎖策略的一種實現的統稱。使用mvcc可以在大多數情況下避免加鎖的操作,為服務帶來更好的效率。

mysql的大多數事務型儲存引擎實現的都不是簡單的行級鎖。基於提公升併發效能的考慮,它們一般都同時實現了多版本併發控制(mvcc)。不同的資料庫實現mvcc的機制不盡相同。

我們可以粗略的認為mvcc是行級鎖的變種,但是它很多情況下避免了加鎖的操作,因此開銷更低。雖然實現機制有所不同,但大都實現了非阻塞的讀操作,寫操作也只鎖定必要的行。

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

innodb通過儲存兩個隱藏列來實現mvcc。這兩個列,乙個列儲存建立時間,乙個列儲存過期時間,這裡儲存的時間不是實際的時間,而且系統版本號。每開始乙個事務,系統版本號都自動遞增,事務開始時刻的系統版本號會作為事務的版本號,用來和查詢到的記錄進行比較。下面我們分析一下在 repeatable read隔離級別下,mvcc具體如何操作:

select:

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

innodb只查詢建立版本號小於等於當前事務版本的資料行。這樣後續其他事務新增記錄的版本號肯定大於當前事務的版本號,也就是說只讀取事務開啟前和當前事務插入的資料行

innodb只查詢過期時間版本號未定義或是大於等於當前資料版本的資料行。這樣讀取的行,都是在事務開啟前未被刪除的行,也就是說,事務執行中其他事務的刪除行操作,還是可以讀取到被刪除的行

只有符合上述兩條記錄,才能返回作為查詢結果

insert:

innodb為新插入的行儲存當前系統版本號作為行版本號

delete:

innodb為刪除的每一行儲存當前系統版本號作為刪除版本號

update:

innodb為插入一條新記錄,儲存當前系統版本號作為行版本號,同時儲存當前系統版本號到原來的行表示刪除標識。這裡需要特別注意,這樣可以事務讀取相同行的結果,不會由於其他事務的修改而影響。

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

mvcc簡單來說就是行級鎖的變種,減少系統鎖操作的次數,減少加解鎖消耗。但是同樣,因為需要維護額外的資源空間,也會為系統帶來額外的儲存空間消耗。一般情況下,mvcc只在 可重複讀 和 讀已提交 兩個隔離級別工作,讀已提交隔離級別因為每次都讀取最新的版本號,不符合使用條件,序列化會對所有讀取的行加鎖,不需要使用mvcc。

多版本併發控制(MVCC)

mysql的大多數事務性儲存引擎 如innodb 實現的都不是簡單的行級鎖。基於提公升併發效能的考慮,它們一般都同時實現了多版本併發控制 mvcc 可以認為mvcc是行級鎖的乙個變種,但是它在很多情況下避免了加鎖操作,因此開銷更低。雖然實現機制有所不同,但大都實現了非阻塞的讀操作,寫操作也只鎖定必要...

多版本併發控制MVCC

大多數mysql的事務性儲存引擎,例如innodb.falcon 和pbxt,不是簡單地使用行加鎖的機制,而是選用一種叫做 多版本併發控制 mvcc,mutiversion concurrency control 的技術,和行加鎖機制關聯使用,以應對更多的併發處理問題。mvcc不是mysql獨有的技...

MVCC多版本併發控制機制

1.1 什麼是mvcc mvcc multi version concurrency control 是一種多版本併發控制機制。與隔離級別緊密聯絡的另外乙個東西是併發排程,通過併發排程實現隔離級別。對於併發排程,不同的資料庫廠商有不同的實現機制,但基本原理類似,都是通過加鎖來保護資料物件不同時被多個...