1. 程式人生 > 其它 >MySQL --- 讀書筆記 --- MVCC

MySQL --- 讀書筆記 --- MVCC

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個比較重要的內容

  1. creator_trx_id:建立當前ReadView的事務
  2. trx_ids:生成ReadView時,當前系統的活躍事務ID列表
  3. up_limit_id:活躍事務中最小ID
  4. low_limit_id:表示生成ReadView時系統應該分配給下一個事務的ID(不是指的活躍ID)

4.3 規則

有了ReadView後,按照以下規則判斷記錄的某個版本是否可見

  • 如果被訪問的版本的trx_idcreator_trx_id一致,當前事務在訪問它自己修改過的記錄,該版本可見
  • 如果被訪問的版本的trx_id小於up_limit_id,表明生成該版本的事務已經在生成ReadView之前提交,該版本可見
  • 如果被訪問的版本的trx_id大於或等於low_limit_id,表明生成該版本事務在生成ReadView之後建立,該版本不可見
  • 如果被訪問的版本的trx_idup_limit_id
    low_limit_id之間,需要判斷是否在trx_ids
    • 在,事務活躍,不可見
    • 不在,事務已提交,可見