關於MySQL的多版本併發控制(MVCC)

2021-10-01 08:32:46 字數 1488 閱讀 2391

mvcc是行級鎖的乙個變種,但他在很多情況下避免了加鎖操作,因此開銷更低,它實現了非阻塞的讀操作以及盡可能少鎖定的寫操作。

mvcc的實現是通過儲存資料在某個時間點的快照來實現的,也就是說,同一事務不同時間看到的資料都是一致的,不同事務同一時間看到的資料可能是不一樣的。

不同儲存引擎的mvcc實現不同,典型的有樂觀併發控制和悲觀併發控制。

我們以常用的innodb來說明mvcc如何工作。innodb的mvcc是通過在每行記錄後面儲存兩個隱藏的列來實現的,乙個儲存行的建立時間,乙個儲存行的過期時間,裡面存的具體值是乙個遞增的版本號,每當乙個事務開始,系統版本號自增。事務開始時的系統版本號作為事務的版本號。

rr隔離級別下mvcc的具體操作如下

我們依照上述所說進行測試。

以下是我的測試過程,建表如下

第一次測試

首先執行第乙個事務

然後執行第二個事務更新資料

回到第乙個事務,執行查詢發現資料為原資料。

確實實現了rr的隔離級別。

第二次測試

先恢復資料,而後第乙個事務啟動

然後執行第二個事務

回到第乙個事務進行查詢

發現查詢結果為修改後資料。

此處發現測試結果與書中所說不相符,事務的版本號不是事務開始時的系統版本號,二是第一次對資料庫進行查詢或操作時的系統版本號。由於測試版本是5.7,猜測原因為新版本為了讓結果更優,使版本號的賦值後延,同樣可以避免不可重複讀的問題。

但是在開發時需要注意此處的改變

更新:mvcc機制會在事務啟動時為每個事務儲存乙個列表,列表中包含此事務開始時還未commit的事務的版本號以防止以下情況

事務1開啟 版本號3

事務2開啟 版本號4

事務2查詢 得到老結果

事務1更新 資料delete version=3

事務2查詢 雖然資料delete version小於當前事務版本號 但由於事務2的列表中包含版本號 3因此這個更新操作仍不可見

Mysql多版本併發控制

mysql的絕大多數事務型儲存引擎都不是簡單的行級鎖。他們實現了多版本的併發控制,也就是mvvc,當然,支援mvvc的資料庫並不只有mysql,orcale postgresql等都實現了mvvc,只不過他們實現的方式不同而已,因為mvvc沒有乙個統一的規範。其實mvvc可以理解為行級鎖的一種變異,...

MySQL 架構 多版本併發控制

大部分的mysql的儲存引擎,比如innodb,falcon,以及pbxt並不是簡簡單單的使用行鎖機制。它們都使用了行鎖結合一種提高併發的技術,被稱為mvcc 多版本併發控制 mvcc並不單單應用在mysql中,其他的資料庫如oracle,postgresql,以及其他資料庫也使用這個技術。mvcc...

mysql多版本併發控制MVCC

innodb的mvcc是通過在每行記錄的後面儲存兩個隱藏的列來實現的,這兩個列乙個儲存行的建立時間,乙個儲存行的過期時間。但是並不是儲存時間而是儲存版本號,每開始乙個新的事務,版本號會自動遞增。事務開始時刻的系統版本號會作為事務的版本號,用來和查詢到每行記錄的版本號進行比較。select innod...