高性能MySQL(第3版)筆記 1.4多版本併發控制

MVCC

全稱Multi-Version Concurrency Control,即多版本併發控制。MVCC是一種併發控制的方法,一般在數據庫管理系統中,實現對數據庫的併發訪問,在編程語言中實現事務內存。
可以認爲MVCC是行級鎖的一個變種,但是它在很多種情況下避免了加鎖操作,因此開銷更低。其他數據庫(Oracle、PostgreSQL)等也都實現了MVCC,他們的實現機制不盡相同,因爲MVCC沒有一個統一的實現標準。雖然實現機制有所不同,但大都實現了非阻塞讀操作,寫操作也只鎖定必要的行。

實現原理

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

不同存儲引擎的MVCC實現是不同的,典型的有樂觀(optimistic)併發控制和悲觀(pessimistic)併發控制。
InnoDB的MVCC,是通過在每行記錄後面保存兩個隱藏的列來實現的。這兩個列,一個保存了行的創建時間,一個保存行的過期時間(或刪除時間)。存儲的時間其實是系統版本號(system version number)。每開始一個新的事務,系統版本號都會遞增。事務開始時刻的系統版本號會作爲事務的版本號,用來和查詢到的每行記錄的版本號進行比較。下面看一下Repeatable Read(可重複讀)隔離級別下,存儲引擎是InnoDB的MVCC具體是如何操作的。

操作類型 操作
SELECT a. 只查找版本早於或等於當前事務版本的數據行,這樣可以確保事務讀取的行,要麼是在事務開始前已經存在的,要麼是事務自身插入或者修改過的。b. 行的刪除版本要麼未定義,要麼大於當前事務版本號。這可以確保事務讀取到的行,在事務開始之前未被刪除。只有複合上述兩個條件的記錄,才能作爲返回結果
INSERT 爲新插入的每一行保存當前系統版本號作爲行版本號。
DELETE 爲刪除的每一行保存當前系統版本號作爲行刪除標識
UPDATE 爲插入新一行記錄,保存當前系統版本號作爲行版本號,同時保存當前系統版本號到原來的行作爲行刪除標識

保存這兩個額外的系統版本號,使大多數讀操作都可以不用加鎖。不過不足之處自然是每行記錄都需要額外的存儲空間,需要更多的行檢查工作,以及一些額外的維護工作。

生效的隔離級別

MVCC只在Repeatable Read和Read Committed兩個隔離級別下工作,Read Uncommitted總是讀取最新的數據行,而不是複合當前事務版本的數據行。而Serializable則會對所有讀取的行都加鎖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章