REPEATABLE READ(可重複讀) 是 InnoDB 預設隔離級別。在 autocommit=0 或 START TRANSACTION 狀態下,同一事務多次 SELECT 同一記錄,結果保持一致(快照讀)。
-- 會話 1 SET autocommit=0; SELECT * FROM test.dd WHERE id=1; -- 讀到 aa=2 -- 會話 2 (獨立事務) UPDATE test.dd SET aa=1 WHERE id=1; -- 修改並提交 COMMIT; -- 會話 3 (新事務) SELECT * FROM test.dd WHERE id=1; -- 讀到 aa=1 (已提交) UPDATE test.dd SET aa=1 WHERE id=1; -- 受影響行數 = 0!
| 會話 | 操作 | 結果 | 說明 |
|---|---|---|---|
| 1 | SELECT | aa=2 | 建立快照 |
| 2 | UPDATE+COMMIT | 成功 | 修改生效 |
| 3 | SELECT | aa=2 | 快照讀,未見會話2修改 |
| 3 | UPDATE | Rows matched: 1, Changed: 0 | 當前讀發現值已是 1,無實際變更 |
利用
Changed: 0判斷資料已被他人修改,適用於狀態位更新、並發控制場景,避免覆蓋他人變更。
| 隔離級別 | 髒讀 | 不可重複讀 | 幻讀 | 備註 |
|---|---|---|---|---|
| READ UNCOMMITTED | ✓ | ✓ | ✓ | 極少使用 |
| READ COMMITTED | ✗ | ✓ | ✓ | Oracle 預設 |
| REPEATABLE READ | ✗ | ✗ | ✗* | InnoDB 預設,MVCC 解決幻讀 |
| SERIALIZABLE | ✗ | ✗ | ✗ | 效能最差 |
* 新版 MySQL (5.7+) 透過 MVCC (多版本並發控制) + Next-Key Lock 解決幻讀問題。
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ 設定