多版本並發控制(MVCC)是 InnoDB、Falcon、PBXT 等現代儲存引擎實現高並發的關鍵技術,同樣應用於 Oracle、PostgreSQL 等主流資料庫。MVCC 結合行鎖,透過版本鏈與可見性判斷,實現非阻塞讀取(讀不阻塞寫、寫不阻塞讀),僅在必要時對寫操作加鎖,大幅提升並發吞吐量。
每行記錄隱藏兩個系統欄位(不佔用使用者定義欄位):
事務啟動時獲得當前系統版本號(事務 ID 快照)。查詢時對每行應用以下規則:
DB_TRX_ID <= 事務版本號。確保行在事務啟動前已存在,或由本事務建立/修改DB_TRX_ID = 當前系統版本號DB_ROLL_PTR 指向舊版本DELETE + INSERT 原子操作DB_TRX_ID = 系統版本號、舊行刪除版本號 = 系統版本號| 隔離級別 | MVCC 生效 | 讀取行為 | 鎖行為 |
|---|---|---|---|
| READ UNCOMMITTED | 否 | 總是讀最新提交版本(髒讀) | 讀不加鎖 |
| READ COMMITTED | 是 | 每次 SELECT 重新獲取快照,讀已提交版本(不可重複讀) | 讀不加鎖 |
| REPEATABLE READ (預設) | 是 | 事務啟動時建立快照,全程可見性一致(可重複讀) | 讀不加鎖,寫加行鎖+間隙鎖 |
| SERIALIZABLE | 否 | 強制加共享鎖,退化為鎖基礎並發控制 | 讀加鎖,並發度最低 |
| 策略 | 並發性 | 開銷 | 代表引擎 |
|---|---|---|---|
| 表鎖 | 最低 | 最低 | MyISAM, MEMORY, MERGE |
| 行鎖 | 高 | 高 | NDB Cluster |
| 行鎖 + MVCC | 最高 | 最高 | InnoDB, Falcon, PBXT |
innodb_max_purge_lag 限流OPTIMIZE TABLE 或 ALTER TABLE ... ENGINE=InnoDB 整理碎片SHOW ENGINE INNODB STATUS\G 中 History list length,超過 10 萬需關注innodb_locks_unsafe_for_binlog=ON(舊版)減少間隙鎖,但可能導致幻讀-- 會話 1:開啟事務,查詢
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT * FROM accounts WHERE id = 1; -- 余額 1000
-- 會話 2:修改並提交
UPDATE accounts SET balance = 2000 WHERE id = 1;
COMMIT;
-- 會話 1:再次查詢(RR 級別)
SELECT * FROM accounts WHERE id = 1; -- 仍為 1000,可重複讀
-- 會話 1:提交後再查
COMMIT;
SELECT * FROM accounts WHERE id = 1; -- 2000
SELECT,使用 MVCC 快照,不加鎖SELECT ... LOCK IN SHARE MODE(共享鎖)SELECT ... FOR UPDATE(排他鎖)UPDATE、DELETE、INSERTLOCK TABLES深入理解 MVCC 版本鏈、可見性判斷、Undo Log 生命週期與 Purge 機制,是診斷 InnoDB 長事務問題、歷史列表膨脹、鎖等待風暴的核心鑰匙。將 MVCC 知識內化為設計原則:事務越短越好、讀寫分離減少當前讀、監控 History List Length,才能駕馭高並發 InnoDB 叢集。