| 級別 | 髒讀 | 不可重複讀 | 幻讀 | MySQL InnoDB 實現 |
|---|---|---|---|---|
| READ UNCOMMITTED (RU) | ✅ 允許 | ✅ 允許 | ✅ 允許 | 無鎖,直接讀最新版本 |
| READ COMMITTED (RC) | ❌ 禁止 | ✅ 允許 | ✅ 允許 | 語句級快照讀 + 行鎖 |
| REPEATABLE READ (RR) | ❌ 禁止 | ❌ 禁止 | ⚠️ 理論允許,實際**Next-Key Lock 防止** | 事務級快照讀 + 行鎖 + Gap Lock |
| SERIALIZABLE | ❌ 禁止 | ❌ 禁止 | ❌ 禁止 | 讀加共享鎖,寫加排他鎖,實際串行 |
MySQL 默認: REPEATABLE READ
[mysqld]
transaction-isolation = REPEATABLE-READ
# 可選值:READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE
修改後重啟 MySQL 生效。
-- 當前會話
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- 全局 (需 SUPER 權限,重啟失效)
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- 查看當前級別
SELECT @@tx_isolation; -- 會話級別
SELECT @@global.tx_isolation; -- 全局級別
SELECT @@autocommit; -- 默認 ON (1)
SET autocommit = 0; -- 關閉自動提交,手動管理事務
重大影響: autocommit=ON 時,每條語句隱式事務,**行鎖在語句結束即釋放**,SELECT ... FOR UPDATE 等鎖語句**完全失效** (鎖獲取後立即釋放)。**務必在顯式事務 (START TRANSACTION) 中使用鎖語句**。
| 鎖類型 | 來源 | 兼容性 | 典型語句 |
|---|---|---|---|
| 共享鎖 (S Lock) | 讀操作 | 兼容 S 鎖,不兼容 X 鎖 | SELECT ... LOCK IN SHARE MODE, SELECT (SERIALIZABLE) |
| 排他鎖 (X Lock) | 寫操作 | 不兼容任何鎖 | SELECT ... FOR UPDATE, UPDATE, DELETE, INSERT |
| 意向共享鎖 (IS) | 表級,表明意圖獲取行 S 鎖 | 兼容 IS, IX | 內部自動添加 |
| 意向排他鎖 (IX) | 表級,表明意圖獲取行 X 鎖 | 兼容 IS, IX | 內部自動添加 |
環境: InnoDB 表 user(id, name, age),會話 A 設置級別並查詢,會話 B 修改數據。
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; START TRANSACTION; SELECT * FROM user WHERE id=1;START TRANSACTION; UPDATE user SET age=20 WHERE id=1; -- 未提交ROLLBACK;結論: 最不安全,但寫操作仍加行共享鎖。
結論: 只有提交後可見,寫操作加行共享鎖。
結論: 事務內建立一致性快照,寫操作加行共享鎖直到提交。
結論: 最嚴格,**讀操作即加共享鎖**,寫操作完全串行,並發效能極低。
| 隔離級別 | 普通 SELECT | SELECT ... FOR UPDATE | UPDATE/DELETE | 幻讀防護 |
|---|---|---|---|---|
| RU | 無鎖 (最新版本) | 行 X 鎖 | 行 X 鎖 | 無 |
| RC | 無鎖 (語句級快照) | 行 X 鎖 | 行 X 鎖 (僅鎖匹配行) | 無 |
| RR | 無鎖 (事務級快照) | 行 X 鎖 | 行 X 鎖 + **Gap/Next-Key Lock** | Next-Key Lock |
| Serializable | **行 S 鎖** | 行 X 鎖 | 行 X 鎖 + Gap Lock | 鎖機制天然防止 |