大多數mysql的事務性儲存引擎,例如innodb. falcon 和pbxt,不是簡單地使用行加鎖的機制,而是選用一種叫做**多版本併發控制(mvcc, mutiversion concurrency control)**的技術,和行加鎖機制關聯使用,以應對更多的併發處理問題。mvcc不是mysql獨有的技術,oracle, postgresql 及其他一些資料庫 系統也使用同樣的技術。
可以將mvcc設想成一種行級加鎖的變形,它避免了很多情況下的加鎖操作,大大降低了系統開銷。依賴於具體技術實現,它可以在讀取期間鎖定需要的記錄的同時,還允許非鎖定讀取。
mvcc是通過及時儲存在某些時刻的資料快照,而得以實現的。這意味著同一事務的多個例項,在同時執行時,無論每個例項執行多久,它們看到的資料檢視是一致的;而同一時間,對於同一張表,不同事務看到的資料卻是不同的!如果使用者之前對此沒有概念,這可能讓人有點迷惑,但隨若熟悉程度的加深,這個概念也很容易理解。
每種儲存引擎實現mvcc的方式是不同的。例如樂觀併發控制(optimistic concurrency control).悲觀併發控制(pessimistic concurrency control).下面通過描述innodb簡化版的行為方式,舉例說明mvcc的工作原理。
innodb通過為每個資料行增加兩個隱含值的方式來實現mvcc.這兩個隱含值記錄了行的建立時間,以及它的過期時間(或者叫刪除時間)。每一行都儲存了事件發生時的系統版本號(system version number),用來替代事件發生時的實際時閥。每一次,開始個新事務時, 版本號都會自 動遞增。每個事務都會儲存它在開始時的「當前系統版本」的記錄,而每個查詢都會根據事務的版本號,檢查每行資料的版本號。下面看一下,當事務隔離級設定為repeatable read時,mvcc在實際操作中的應用方式:
select
innodb檢查每行資料,確保它們符合兩個標準:
只有通過上述兩項測試的資料行,才會被當做查詢結果返回。
insert
innodb為每個新增行記錄當前系統版本號。
delete
innodb為,刪除行記錄當前系統版本號,作為行刪除標識。
update
innodb會為每個需要更新的行,建立乙個新的行拷貝,井且為新的行拷貝,記錄當前的系統版本號。同時,也為更新前的舊行,記錄系統的版本號,作為舊行的刪除版本標識。
儲存這些額外記錄的好處,是使大多數讀操作都不必申**鎖,這使讀操作變得盡可能的快,因為讀操作只要選取符合標準的行資料即可。這種方式的缺點是,儲存引擎必須為每行資料,儲存更多的額外資料,做更多的行檢查工作,以及處理一些額外的整理操作(housekeeping operations)。
mvcc只工作在repeatable read和read committed兩個隔離級。read uncommitted隔離級不相容mvcc,
因為在任何情況下,該隔離級下的查詢,不讀取符合當前事務版本的資料行,而讀取最新版本的資料行。serializable隔離級也不相容mvcc,因為該級下的讀操作會對每乙個返回行都進行加鎖。表1-2彙總了mysql中的各種加鎖模型和併發級別。
表1-2:使用預設隔離級的mysql鎖定模型和併發性
加鎖策略
併發系統開銷
引擎表級加鎖
最低最低
myisam,merge,memory
行級加鎖高高
ndb cluster
支援mvcc的行級加鎖
最高最高
innodb、falcon、pbxt、soliddb
多版本併發控制(MVCC)
mysql的大多數事務性儲存引擎 如innodb 實現的都不是簡單的行級鎖。基於提公升併發效能的考慮,它們一般都同時實現了多版本併發控制 mvcc 可以認為mvcc是行級鎖的乙個變種,但是它在很多情況下避免了加鎖操作,因此開銷更低。雖然實現機制有所不同,但大都實現了非阻塞的讀操作,寫操作也只鎖定必要...
MVCC(多版本併發控制)
mvcc是資料庫鎖策略的一種實現的統稱。使用mvcc可以在大多數情況下避免加鎖的操作,為服務帶來更好的效率。mysql的大多數事務型儲存引擎實現的都不是簡單的行級鎖。基於提公升併發效能的考慮,它們一般都同時實現了多版本併發控制 mvcc 不同的資料庫實現mvcc的機制不盡相同。我們可以粗略的認為mv...
MVCC多版本併發控制機制
1.1 什麼是mvcc mvcc multi version concurrency control 是一種多版本併發控制機制。與隔離級別緊密聯絡的另外乙個東西是併發排程,通過併發排程實現隔離級別。對於併發排程,不同的資料庫廠商有不同的實現機制,但基本原理類似,都是通過加鎖來保護資料物件不同時被多個...