MySQL --- 讀書筆記 --- MVCC
阿新 • • 發佈:2022-05-22
1. 什麼是MVCC
MVCC(Multiversion Concurrency Control),多版本併發控制,通過資料行的多個版本管理來實現資料庫的併發控制,使得在事務隔離級別下執行一致性讀有了保證。MVCC沒有正式標準。
2. 快照讀與當前讀
快照讀
又叫一致性讀,讀取的是快照資料。不加鎖的簡單SELECT都屬於快照讀
前提是,當前隔離級別不是序列,序列會退化為當前讀
當前讀
讀取的是最新資料,還要保證讀取時,其他併發事務不能修改當前資料,會對讀取記錄加鎖
4. MVCC實現原理之ReadView
MVCC的實現依賴於:隱藏欄位、undo log、read view
4.1 什麼是ReadView
多個事務對記錄的修改,會產生多個歷史版本,這些歷史記錄都在 undo log 中,當需要讀取時,讀取哪個歷史版本,就需要用到ReadView
。
ReadView
就是事務在進行快照讀時產生的檢視,當事務啟動,會生成資料庫系統當前的快照。InnoDB為每個事務構造了一個數組,用來記錄並維護當前活躍事務
的ID
核心問題是需要判斷一下歷史版本中的哪個版本是當前事務可見的,這是ReadView
要解決的主要問題
4.2 設計思路
ReadView包含4個比較重要的內容
- creator_trx_id:建立當前ReadView的事務
- trx_ids:生成ReadView時,當前系統的活躍事務ID列表
- up_limit_id:活躍事務中最小ID
- low_limit_id:表示生成ReadView時系統應該分配給下一個事務的ID(不是指的活躍ID)
4.3 規則
有了ReadView
後,按照以下規則判斷記錄的某個版本是否可見
- 如果被訪問的版本的
trx_id
與creator_trx_id
一致,當前事務在訪問它自己修改過的記錄,該版本可見 - 如果被訪問的版本的
trx_id
小於up_limit_id
,表明生成該版本的事務已經在生成ReadView之前提交,該版本可見 - 如果被訪問的版本的
trx_id
大於或等於low_limit_id
,表明生成該版本事務在生成ReadView之後建立,該版本不可見 - 如果被訪問的版本的
trx_id
在up_limit_id
low_limit_id
之間,需要判斷是否在trx_ids
中- 在,事務活躍,不可見
- 不在,事務已提交,可見