Mysql知識延展(七)MVCC多版本併發控制

2021-09-29 20:39:52 字數 2013 閱讀 8489

mvcc簡述

mvcc(mutil-version concurrency control),就是多版本併發控制。mvcc 是一種併發控制的方法,一般在資料庫管理系統中,實現對資料庫讀寫的併發訪問

在mysql的innodb引擎中就是指在已提交讀(read committd)可重複讀(repeatable read)這兩種隔離級別下的事務對於select操作會訪問版本鏈中的記錄的過程。這就使得別的事務可以修改這條記錄,反正每次修改都會在版本鏈中記錄select可以去版本鏈中讀取記錄,這就實現了讀-寫,寫-讀的併發執行,提公升了系統的效能。

當前讀和快照讀

在mvcc併發控制中,讀操作可以分成兩類:

一致性非鎖定讀

一致性非鎖定讀(consistent nonlocking read)是指innodb儲存引擎通過多版本控制(mvcc)讀取當前數

據庫中行資料的方式

如果讀取的行正在執行delete或update操作,這時讀取操作不會因此去等待行鎖的釋放。相反地,innodb會去讀取行的乙個最新可見快照

若出現ab會話如下圖所示:

當會話b提交事務後,會話a再次執行 select * from test where id = 1 的sql語句

時,兩個不同的事務隔離級別下得到的結果可能就不一樣了。

mysql實現mvcc依賴undo log以及read view

版本鏈在innodb引擎表中,它的聚簇索引記錄中有兩個必要的隱藏列

事務鍊錶

mysql中的事務開始到提交這段過程中,都會被儲存到乙個叫trx_sys的事務鍊錶中,這是乙個基本

的鍊錶結構:

ct-trx --> trx11 --> trx9 --> trx6 --> trx5 --> trx3;

事務鍊錶中儲存的都是還未提交的事務,事務一旦被提交,則會被從事務鍊錶中摘除

show engine innodb status,就能夠看到事務列表。

readview

readview中主要就是有個列表儲存我們系統中當前活躍著的讀寫事務,也就是begin了還未提交的事務。通過這個列表來判斷記錄的某個版本是否對當前事務可見。假設當前列表裡的事務id為[80,100]。

這些記錄都是去版本鏈裡面找的先找最近記錄,如果最近這一條記錄事務id不符合條件,不可見的話再去找上乙個版本再比較當前事務的id和這個版本事務id看能不能訪問,以此類推直到返回可見的版本或者結束

參考:

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

什麼是多版本併發控制 多版本併發控制技術的英文全稱是multiversion concurrency control,縮寫為mvcc。多版本併發控制 mvcc 是通過在特定時間點儲存資料快照來實現的。也就是說,無論事務執行多長時間,事務內部看到的資料都不會受到其他事務的影響。根據事務的開始時間,每個...