事務隔離級別是為了在併發場景下保證資料讀取正確性,同時平衡效能而定義的四個標準級別。隔離級別越高,併發效能通常越低。
| 隔離級別 | 髒讀 | 不可重複讀 | 幻讀 | 鎖策略特徵 |
|---|---|---|---|---|
| READ UNCOMMITTED (讀未提交) | ✅ 可能 | ✅ 可能 | ✅ 可能 | 無共享鎖,效能最高 |
| READ COMMITTED (讀已提交) | ❌ 不可能 | ✅ 可能 | ✅ 可能 | 語句級一致性讀,RC |
| REPEATABLE READ (可重複讀) | ❌ 不可能 | ❌ 不可能 | ✅ 可能 | 事務級一致性讀,RR(InnoDB 預設) |
| SERIALIZABLE (串行化) | ❌ 不可能 | ❌ 不可能 | ❌ 不可能 | 全表鎖/範圍鎖,效能最低 |
SHOW VARIABLES LIKE 'transaction_isolation'; -- 可動態修改 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; SET GLOBAL TRANSACTION ISOLATION LEVEL REPEATABLE READ;
SELECT ... FOR UPDATE/LOCK IN SHARE MODE)加Next-Key Lock(記錄鎖+間隙鎖)防止幻讀| 場景 | 建議級別 | 理由 |
|---|---|---|
| 高併發讀多寫少、可容忍幻讀 | READ COMMITTED | 鎖較少、併發高、主從一致性好 |
| 金融核心、強一致性要求 | REPEATABLE READ | 預設、事務級一致性、配合 Next-Key Lock 防幻讀 |
| 極簡報表、可接受鎖等待 | SERIALIZABLE | 完全串行、無併發異常 |
| 緩存刷新、日誌寫入等非關鍵 | READ UNCOMMITTED | 效能極致、業務允許髒讀 |
-- 會話 A SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; START TRANSACTION; SELECT * FROM t WHERE id > 10; -- 快照讀 -- 會話 B 插入 id=15 提交 SELECT * FROM t WHERE id > 10; -- 仍不見 id=15(RR 快照讀) SELECT * FROM t WHERE id > 10 FOR UPDATE; -- 當前讀,會見到/加鎖阻塞 COMMIT;