mysql中的大多數事務性儲存引擎實現的都不是簡單的行級鎖。基於提公升併發效能的考慮,他們一般實現了多版本併發控制(mvcc)。不僅是mysql,包括oracle,postgresql等其他資料庫也實現了mvcc,但各自的實現機制不盡相同,應為mvcc沒有乙個統一的實標準。
那麼什麼是mvvc呢
可以認為mvcc是乙個行級鎖的變種,但是他們在大多數情況下避免了加鎖的操作,因此開銷更低。雖然實現的機制不同,但是大都實現了非阻塞的操作,寫操作也只鎖定必要的行。
mvcc的實現,是通過儲存資料在某個時間的快照來實現的。也就是說,不管需要執行多長時間,每個事物看到的資料都是一致的。根據事物開始的時間不同,每個事物對同一張表,同一時刻看到的資料可能不同。
不同的儲存引擎對mvcc實現是不同的,典型的有樂觀併發控制和悲觀併發控制。
innodb的mvcc,是通過每行記錄後面儲存兩個隱藏的列來實現的。這兩個列,乙個儲存了建立的時間,乙個儲存了過期的時間(或刪除時間)。當然儲存的並不是實際的時間,而是系統的版本號。每開始乙個新的事物,系統的版本號就會自動遞增。事物開始時刻的系統版本號會作為事物的版本號,用來和查詢到的每行記錄的版本號進行比較。下面是乙個repeatable read隔離級別下,mvcc具體是如何實現操作的。
select
innodb會根據以下兩個條件檢查每行的記錄:
a、innodb只查詢版本早於當前事物版本的資料行(也就是說,行的版本號小於或等於事物的系統版本號),這樣可以確保事物讀取的行,要麼是在事物開始前已經存在的,要麼事物自身插入或 修改的。
b、行的刪除版本要麼未定義,要麼大於當前事物的版本號。這可以確保事物讀取到的行,在事物開始前就被刪除。
insert
innodb為新插入的每一行儲存當前版本號作為行的版本號。
delete
innodb為刪除的每一行儲存當前的版本號作為行刪除標識。
update
innod為插入一行新紀錄,儲存當前的版本號作為行版本號,同時儲存當前系統版本號到原來的行作為刪除標識。
儲存這兩個額外的系統版本號,是大數讀操作不用加鎖。這樣的設計使得讀操作很簡單,效能很好,並且能夠保證只讀取到符合標準的行。不足之處就是每行記錄都需要額外的空間,需要做更多的行檢查工作,以及一些額外的維護工作。
mvcc只在repeatable red 和 read commited兩個隔離級別下工作。其他的兩個隔離級別都和mvcc不相容,應為read uncommitted總是最新的行,而不是符合當前事物版本的資料行。而serializable則會對所有的讀取行加鎖。
PostgreSQL 多版本併發控制MVCC
什麼是mvcc?mvcc,multi version concurrency control,多版本併發控制,mvcc就是用同乙份資料臨時保留多版本的方式,實現併發控制。它可以避免讀寫事務之間的互相阻塞,相比通常的封鎖技術可極大的提高業務的併發效能。如果有人從資料庫中讀資料的同時,有另外的人寫入資料...
Mysql多版本併發控制
mysql的絕大多數事務型儲存引擎都不是簡單的行級鎖。他們實現了多版本的併發控制,也就是mvvc,當然,支援mvvc的資料庫並不只有mysql,orcale postgresql等都實現了mvvc,只不過他們實現的方式不同而已,因為mvvc沒有乙個統一的規範。其實mvvc可以理解為行級鎖的一種變異,...
MySQL 架構 多版本併發控制
大部分的mysql的儲存引擎,比如innodb,falcon,以及pbxt並不是簡簡單單的使用行鎖機制。它們都使用了行鎖結合一種提高併發的技術,被稱為mvcc 多版本併發控制 mvcc並不單單應用在mysql中,其他的資料庫如oracle,postgresql,以及其他資料庫也使用這個技術。mvcc...