MySQL 多版本控制 MVCC 機制初探

2021-10-09 01:33:47 字數 1328 閱讀 3460

總結搞定mysql

帶你搞定mysql實戰,輕鬆對應海量業務處理及高併發需求,從容應對大場面試

mysql innodb 儲存引擎,實現的是基於多版本的併發控制協議——mvcc,而不是基於鎖的併發控制。

mvcc 最大的好處是讀不加鎖,讀寫不衝突。在讀多寫少的 oltp(on-line transaction processing)應用中,讀寫不衝突是非常重要的,極大的提高了系統的併發效能。

在 mvcc 併發控制中,讀操作可以分為兩類: 快照讀(snapshot read)與當前讀 (current read)。

mvcc 只在 read commited 和 repeatable read 兩種隔離級別下工作

如何區分快照讀和當前讀呢? 可以簡單的理解為:

為了更直觀地理解 mvcc 的實現原理,這裡舉乙個「事務對某行記錄更新的過程」的案例來講解 mvcc 中多版本的實現。

假設 f1~f6 是表中字段的名字,1~6 是其對應的資料。後面三個隱含字段分別對應該行的隱含id、事務號和回滾指標,如下圖所示

【更新過程】

首先,假如這條資料是剛 insert 的,可以認為 id 為 1,其他兩個欄位為空。

然後,當事務 1 更改該行的資料值時,會進行如下操作,如下圖所示

接下來,與事務 1 相同,此時 undo log 中有兩行記錄,並且通過回滾指標連在一起。因此,如果 undo log 一直不刪除,則會通過當前記錄的回滾指標回溯到該行建立時的初始內容,所幸的是在 innodb 中存在 purge 執行緒,它會查詢那些比現在最老的活動事務還早的 undo log,並刪除它們,從而保證 undo log 檔案不會無限增長,如下圖所示

mvcc機制的實現就是通過read-view機制undo版本鏈比對機制,使得不同的事務會根據資料版本鏈對比規則讀取同一條資料在版本鏈上的不同版本資料。

mysql多版本併發控制MVCC

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

mysql多版本併發控制MVCC

set global transaction isolation level read committed 全域性的 set session transaction isolation level read committed 當前會話 複製 set autocommit 1 自動提交,為0手動提交...

MySQL 多版本併發控制(MVCC)

可以認為mvcc是行級鎖的乙個變種,但是它在很多情況下避免了加鎖的操作,因此開銷會很低。主要實現的是非阻塞的讀操作,寫操作也只是鎖定必要的行。mvcc的實現是通過儲存資料在某個時間點的快照來實現的,也就是說,不管需要執行多長時間,每乙個事務看到的資料都是一致的,根據事務開始的時間不同,每個事務對同一...