MVCC多版本併發控制機制

2021-09-11 08:46:13 字數 1568 閱讀 8074

1.1 什麼是mvcc

mvcc(multi-version concurrency control)是一種多版本併發控制機制。

與隔離級別緊密聯絡的另外乙個東西是併發排程,通過併發排程實現隔離級別。對於併發排程,不同的資料庫廠商有不同的實現機制,但基本原理類似,都是通過加鎖來保護資料物件不同時被多個事務修改。

多版本的併發控制(mvcc)相對於傳統的基於鎖的併發控制主要特點是讀不上鎖,這種特性對於讀多寫少的場景,大大提高了系統的併發度,因此大部分關係型資料庫都實現了mvcc。

1.2 mvcc是為了解決什麼問題?

大多數的mysql事務型儲存引擎,如,innodb,falcon以及pbxt都不使用一種簡單的行鎖機制.事實上,他們都和mvcc–多版本併發控制來一起使用.

大家都應該知道,鎖機制可以控制併發操作,但是其系統開銷較大,而mvcc可以在大多數情況下代替行級鎖,使用mvcc,能降低其系統開銷.

mvcc是通過儲存資料在某個時間點的快照來實現的. 不同儲存引擎的mvcc. 不同儲存引擎的mvcc實現是不同的,典型的有樂觀併發控制和悲觀併發控制.

2.mvcc 具體實現分析

下面,我們通過innodb的mvcc實現來分析mvcc使怎樣進行併發控制的. 

innodb的mvcc,是通過在每行記錄後面儲存兩個隱藏的列來實現的,這兩個列,分別儲存了這個行的建立時間,乙個儲存的是行的刪除時間

這裡儲存的並不是實際的時間值,而是系統版本號(可以理解為事務的id),每開始乙個新的事務,系統版本號就會自動遞增,事務開始時刻的系統版本號會作為事務的id.

下面看一下在repeatable read隔離級別下,mvcc具體是如何操作的.

insert

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

select

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

a.innodb只會查詢版本早於當前事務版本的資料行

(也就是,行的系統版本號小於或等於事務的系統版本號),這樣可以確保事務讀取的行,要麼是在事務開始前已經存在的,要麼是事務自身插入或者修改過的. 

b.行的刪除版本要麼未定義,要麼大於當前事務版本號

這可以確保事務讀取到的行,在事務開始之前未被刪除. 

只有a,b同時滿足的記錄,才能返回作為查詢結果.

delete

innodb會為刪除的每一行儲存當前系統的版本號(事務的id)作為刪除標識. 

update

innodb執行update,實際上是新插入了一行記錄,並儲存其建立時間為當前事務的id,同時儲存當前事務id到要update的行的刪除時間.

MVCC多版本併發控制機制詳解

mvcc多版本併發控制機制 上節我們說到了事務的acid特性和四種隔離級別,其中在可重複讀級別下是如何保證事務較高的隔離性的?靠mvcc multi version concurrency control 機制來保證的。mysql在讀已提交和可重複讀隔離級別下都實現了mvcc機制。undo日誌版本鏈...

多版本併發控制(MVCC)

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

多版本併發控制MVCC

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