首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL MVCC 多版本並發控制核心原理:隱藏列、ReadView、一致性讀、鎖對比、GBase 8 實現

     編輯:MySQL 綜合教學

MVCC 是 InnoDB 高併發的核心基石,實現「讀不阻塞寫,寫不阻塞讀」。本文從隱藏列、版本鏈、ReadView 構建、一致性讀判斷、與鎖模型對比、GBase 8 實現差異六個維度深度解析。

核心數據結構:兩個隱藏列 + Undo Log 版本鏈

  • DB_TRX_ID (6 字節):創建/最後修改該行的事務 ID (單調遞增)。
  • DB_ROLL_PTR (7 字節):指向 Undo Log 中該行的上一版本,形成版本鏈。
  • DB_ROW_ID (6 字節):無主鍵時的隱式單調遞增 ID (非 MVCC 核心)。

每次 UPDATE/DELETE 產生新版本,舊版本經 Undo Log 串聯,INSERT 無舊版本。

ReadView:一致性視圖的判斷標準

事務啟動時 (READ COMMITTED 每語句、REPEATABLE READ 首次 SELECT) 構建 ReadView,包含四個關鍵字段:

  • m_ids:當前活躍事務 ID 列表 (已啟動未提交)。
  • min_trx_id:m_ids 中最小值。
  • max_trx_id:系統已分配的最大事務 ID + 1 (將來某時刻)。
  • creator_trx_id:創建 ReadView 的事務 ID。

版本可見性判斷算法 (核心邏輯)


函數 visible(版本 trx_id, ReadView rv):
  IF trx_id < rv.min_trx_id:        RETURN TRUE   -- 提交於 ReadView 創建前
  IF trx_id >= rv.max_trx_id:       RETURN FALSE  -- 未提交或將來事務
  IF trx_id IN rv.m_ids:            RETURN FALSE  -- 活躍事務未提交
  IF trx_id == rv.creator_trx_id:   RETURN TRUE   -- 自己修改的版本
  RETURN FALSE

遍歷版本鏈從新到舊,第一個 visible()=TRUE 的版本即為可見版本。

隔離級別下的 ReadView 差異

隔離級別ReadView 構建時機現象
READ UNCOMMITTED無 ReadView,直接讀最新版本髒讀
READ COMMITTED每條 SELECT 語句執行前不可重複讀、幻讀
REPEATABLE READ (默認)事務首次 SELECT可重複讀、InnoDB 通過 Next-Key Lock 解決幻讀
SERIALIZABLE加鎖讀 (SELECT ... LOCK IN SHARE MODE)完全串行化,性能最差

一致性讀 vs 鎖定讀

  • 一致性讀 (Consistent Read):普通 SELECT,利用 MVCC 讀歷史版本,**無鎖**。
  • 鎖定讀:
    • SELECT ... LOCK IN SHARE MODE:共享鎖 (S 鎖)。
    • SELECT ... FOR UPDATE:排他鎖 (X 鎖)。
  • DDL 期間:DROP TABLE/ALTER TABLE 期間一致性讀失效 (表重建/刪除)。

MVCC vs 傳統鎖模型

維度MVCC傳統鎖 (S/X)
讀寫衝突無 (讀歷史版本)讀等待寫鎖、寫等待讀鎖
寫寫衝突需行鎖 (X 鎖) 串行化需行鎖串行化
鎖開銷極低 (僅寫加鎖)高 (讀寫皆加鎖)
死鎖概率較低較高
實現複雜度高 (Undo Log、版本鏈、ReadView、Purge)低

結論:MVCC 以空間 (Undo Log) 換時間 (無鎖讀),是高併發 OLTP 的最優選擇。

GBase 8 / 國產數據庫實現差異

  • 默認隔離級別:READ COMMITTED (MySQL 默認 RR)。
  • 一致性讀時間戳:RC 每語句當前時間戳,RR 事務首次查詢時間戳。
  • DROP TABLE/ALTER TABLE 同樣導致一致性讀失效 (表重建/刪除)。
  • Purge 線程回收策略可能不同,長事務導致 Undo Log 膨脹風險一致。

運維關鍵指標

  • SHOW ENGINE INNODB STATUS → History list length:Undo Log 待清理版本數,>10萬警示長事務/大事務。
  • innodb_max_purge_lag:延遲 DML 以讓 Purge 趕上,預設 0 (不延遲)。
  • 長事務監控:SELECT * FROM information_schema.INNODB_TRX WHERE TIME_TO_SEC(TIMEDIFF(NOW(), trx_started)) > 60;。

MVCC 讓 InnoDB 在高併發下依然保持極高吞吐,理解其判斷邏輯、隔離級別差異、Purge 機制,是性能調優與故障診斷的核心能力。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved