mvcc原理_Mysql MVCC实现原理
本文中用到的概念解釋
數據讀取特性
不可重復讀
指一個事務范圍內兩個相同的查詢卻返回了不同數據
這是由于查詢時系統(tǒng)中其他事務修改的提交而引起的
幻讀
在兩個連續(xù)的查找之間一個并發(fā)的修改事務修改了查詢的數據集,導致這兩個查詢返回了不同的結果
這是由于查詢時系統(tǒng)中其他事務新增或者刪除記錄引起的
事務隔離級別
Read Commited(提交讀)
一個事務從開始到提交前,所作的任何修改對其他事務不可見
僅能讀取到已提交的記錄,這種隔離級別下,每條語句都會讀取已提交事務的更新,若兩次查詢之間有其他事務提交,則會導致兩次查詢結果不一致。
Repeatable Read(可重復讀)
在同一個事務中,多次讀取同樣的記錄的結果是一致的
快照讀與當前讀
在MVCC并發(fā)控制中,讀操作可以分成兩類,快照讀與當前讀
快照讀
讀取的是記錄數據的可見版本(可能是過期的數據),不用加鎖
簡單select使用該讀取方式
當前讀
讀取的是記錄數據的最新版本,并且當前讀返回的記錄都會加上鎖,保證其他事務不會再并發(fā)的修改這條記錄
select ... lock in share mode
select ... for update
insert
update
delete
以上查詢將使用當前讀
什么是MVCC
指多版本并發(fā)控制,讓普通的select語句直接讀取指定版本的值,避免加鎖,來提高并發(fā)請求時的性能,配合行鎖機制,在并發(fā)請求下,提高了MYSQL的性能
MVCC解決了什么問題
做到了讀不影響寫,寫不影響讀,提高了并發(fā)性能
提供了一致性讀的功能,避免幻讀和不可重復讀
什么時候會用到MVCC
在RC和RR隔離級別下,innodb通過快照讀方式讀取數據時使用
MVCC實現原理
通過保存數據在某個時間點的快照來實現,具有以下兩個特點
不管執(zhí)行多長時間,同一個事務在執(zhí)行的過程中看到的數據是一致的
根據事務的開始時間不同,不同事務的對同一張表,同一時刻看到的數據可能是不一樣的
MVCC具體實現
隱藏列
innodb行都設置了隱藏列(對查詢不可見),和MVCC有關的包含如下
DATA_TRX_ID: 產生這條記錄的事務ID,INSERT/UPDATE/DELETE時都會更新這個記錄
DATA_ROLL_PTR: 指向該行回滾段的指針,該行上所有舊的版本,在undo中都通過鏈表的形式組織,該值指向undo中下一個歷史記錄,歷史記錄按照由新到舊順序排列
DELETED: BIT位,刪除標志0或者1
事務鏈表(當前活躍鏈表)
MySQL中的事務在開始到提交這段過程中,都會被保存到一個叫trx_sys的全局事務鏈表中,這是一個基本的鏈表結構
事務鏈表中保存的都是還未提交的事務,事務一旦被提交,則會被從事務鏈表中摘除
ReadView
在SQL開始的時候被創(chuàng)建的一個數據結構,包含以下三個
low_limit_id 表示該SQL啟動時,當前事務鏈表中最大的事務id編號,也就是最近創(chuàng)建的除自身以外最大事務編號;
up_limit_id 表示該SQL啟動時,當前事務鏈表中最小的事務id編號,也就是當前系統(tǒng)中創(chuàng)建最早但還未提交的事務;
trx_ids 存儲當前trx_sys事務鏈表中的事務id集合。
數據讀取規(guī)則
邏輯圖
流程描述
先根據DATA_TRX_ID,ReadView 判斷記錄可見性
如果可見,根據 DELETED 判斷數據是否刪除
如果不可見,根據 DATA_ROLL_PTR 判斷是否有歷史版本,沒有則結束,如果有則取出歷史版本,重新執(zhí)行這個流程,直到找到可見數據或者檢查完所有歷史版本
如何判斷可見性
DATA_TRX_ID小于up_limit_id
說明在事務開始前已經提交完成的數據,對于當前事務來說是可見的
DATA_TRX_ID大于low_limit_id
說明在查詢的時候,這條數據還沒有提交,不可見
DATA_TRX_ID位于up_limit_id和low_limit_id之間
遍歷ReadView中的trx_ids,判斷DATA_TRX_ID是否在其中
如果不在,表示事務已提交,數據可見
如果在,表示事務未提交,數據不可見
MVCC是如何解決幻讀和不可重復讀問題的
關鍵在于創(chuàng)建ReadView的時機
在RC隔離級別下,單個事務每次執(zhí)行SELECT語句時都會創(chuàng)建ReadView,所以兩個相同條件的查詢可能由于隨著時間的推移,ReadView更新后可以看到更多已提交的數據,導致不可重復讀和幻讀
在RR隔離級別下,單個事務只會在第一次執(zhí)行SELECT查詢時創(chuàng)建ReadView,后續(xù)不再更新,所以整個事務期間可以看到的數據都是相同的,不會出現不可重復讀和幻讀
總結
以上是生活随笔為你收集整理的mvcc原理_Mysql MVCC实现原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux配置4g网络命令_树莓派移动网
- 下一篇: 数据拆分_数据拆分,偏方请拿好