一致性讀 = 快照讀 = MVCC 讀已提交數據,非阻塞。異常:本事務內修改的未提交數據可讀(當前讀)。
| 隔離級別 | 快照建立時間點 | 特點 |
|---|---|---|
| REPEATABLE READ (默認) | 事務第一條語句執行時(非 BEGIN) | 事務級多版本,單一 ReadView,支持可重複讀 |
| READ COMMITTED | 每條 SELECT 執行時 | 語句級多版本,每查詢新建 ReadView,代價更高 |
Session A: BEGIN; SELECT * FROM t1; -- 空
Session B: INSERT INTO t1 VALUES(1,1); COMMIT;
Session A: SELECT * FROM t1; -- 仍空(快照在第一條 SELECT 前)
Session A: SET i=1; -- 報錯
Session B: INSERT ... COMMIT;
Session A: SELECT * FROM t1; -- 仍空
Session A: SELECT * FROM t1; -- 空
Session B: INSERT ... COMMIT;
Session A: SELECT * FROM t1; -- 仍空
Session A: BEGIN; SELECT ...; UPDATE t1 SET c2=100 WHERE c1=1; SELECT ...; -- 可見 100
-- UPDATE 為當前讀,加鎖讀最新版本
START TRANSACTION WITH CONSISTENT SNAPSHOT;
-- 僅 RR 隔離級別有效,等價於 START TRANSACTION; SELECT 1 FROM any_innodb_table;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION /*!40100 WITH CONSISTENT SNAPSHOT */;
SAVEPOINT sp; SELECT * FROM t1; ROLLBACK TO sp;
SAVEPOINT sp; SELECT * FROM t2; ROLLBACK TO sp; ...
SAVEPOINT 前 → 該表導出時報錯 Table definition changedSAVEPOINT 後、ROLLBACK TO 前 → MDL 鎖衝突,雙方阻塞ROLLBACK TO 後 → 無影響原因:ALTER/DROP/RENAME/TRUNCATE TABLE 破壞 MVCC 構建一致性快照的能力(官方文檔明確聲明)。