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 是通過在特定時間點儲存資料快照來實現的。也就是說,無論事務執行多長時間,事務內部看到的資料都不會受到其他事務的影響。根據事務的開始時間,每個...