MySQL 事務隔離級別設定與驗證:從 READ UNCOMMITTED 到 SERIALIZABLE 完整指南
事務隔離級別決定了併發事務間的可見性邊界。MySQL/InnoDB 支援 SQL-92 標準四級隔離,預設 REPEATABLE READ。本文整理設定指令、行為差異、驗證實驗與選型建議。
四大隔離級別對比
| 隔離級別 | 髒讀 | 不可重複讀 | 幻讀 | InnoDB 實現機制 | 典型場景 |
| READ UNCOMMITTED | ✅ 可能 | ✅ 可能 | ✅ 可能 | 無鎖讀,直接讀最新版本 | 極高併發、可容忍髒讀(如日誌統計) |
| READ COMMITTED | ❌ | ✅ 可能 | ✅ 可能 | 每次一致性讀建立新 Read View | Oracle/PostgreSQL 預設、需見最新提交 |
| REPEATABLE READ | ❌ | ❌ | ❌ (MVCC + Next-Key Lock) | 事務啟動建立 Read View,全程複用 | MySQL/InnoDB 預設、大多數業務 |
| SERIALIZABLE | ❌ | ❌ | ❌ (鎖表/間隙鎖) | 隱式加共享鎖,強制串行 | 極嚴格一致性、報表/結算 |
設定與查看指令
會話級(當前連線生效)
-- 查看當前隔離級別
SELECT @@transaction_isolation;
-- 或
SELECT @@tx_isolation;
-- 設定當前會話隔離級別
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE;
全域級(新連線生效,需重連)
SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 永久生效寫入 my.cnf
[mysqld]
transaction-isolation=REPEATABLE-READ
事務級(單次事務指定)
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
-- 事務邏輯
COMMIT;
驗證實驗:幻讀與 MVCC
準備
CREATE TABLE t (id INT PRIMARY KEY, val INT) ENGINE=InnoDB;
INSERT INTO t VALUES (1,10),(2,20),(3,30);
實驗 1:REPEATABLE READ 防幻讀(Next-Key Lock)
-- 會話 A
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
START TRANSACTION;
SELECT * FROM t WHERE id > 0; -- 見 1,2,3
-- 會話 B (另一終端)
INSERT INTO t VALUES (4,40);
COMMIT;
-- 會話 A 再次查詢
SELECT * FROM t WHERE id > 0; -- 仍見 1,2,3 (無幻讀)
COMMIT;
實驗 2:READ COMMITTED 會見到幻讀
-- 會話 A
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
START TRANSACTION;
SELECT * FROM t WHERE id > 0; -- 見 1,2,3
-- 會話 B
INSERT INTO t VALUES (4,40);
COMMIT;
-- 會話 A 再次查詢
SELECT * FROM t WHERE id > 0; -- 見 1,2,3,4 (幻讀出現)
COMMIT;
InnoDB 核心機制:MVCC + Next-Key Lock
- MVCC(多版本並發控制):Undo Log 構建版本鏈,Read View 判定可見性
- Read View:包含
trx_ids(活躍事務 ID 列表)、low_limit_id、up_limit_id、creator_trx_id
- REPEATABLE READ:事務首次 SELECT 建立 Read View,後續複用 → 同一事務多次查詢結果一致
- READ COMMITTED:每次 SELECT 重建 Read View → 能見到其他事務提交的新版本
- Next-Key Lock:記錄鎖 + 間隙鎖,封鎖區間插入,解決幻讀
選型建議
| 業務特徵 | 建議隔離級別 | 理由 |
| 一般 OLTP(電商、支付、用戶中心) | REPEATABLE READ (預設) | 平衡一致性與併發,InnoDB 優化最成熟 |
| 需即時見最新提交(即時儀表板、庫存查詢) | READ COMMITTED | 配合 binlog_format=ROW 避免主從不一致 |
| 統計報表、離線分析、可容忍髒讀 | READ UNCOMMITTED | 無鎖讀,最高併發,但極少用 |
| 月結/日結、財務對帳、嚴格串行需求 | SERIALIZABLE | 效能極差,僅極少數場景 |
常見誤區
- 以為 RR 完全無幻讀:InnoDB 用 Next-Key Lock 解決「當前讀」幻讀,但「快照讀」(普通 SELECT) 靠 MVCC 天然無幻讀。鎖定讀
SELECT ... FOR UPDATE 才加 Next-Key Lock
- 以為設定隔離級別需重啟:會話級/事務級即時生效,僅全域級需新連線
- 忽略 Binlog 格式影響:
binlog_format=STATEMENT 下,READ COMMITTED 可能導致主從不一致,生產必須 ROW 格式
隔離級別是併發與一致性的天平。預設 REPEATABLE READ 滿足 95% 以上業務。若確需 READ COMMITTED,務必配合 binlog_format=ROW 並充分測試。不要輕易調整全域隔離級別,會話級按需設定更安全。