InnoDB 通过 MVCC 与锁机制实现四种事务隔离级别。理解快照读(Snapshot Read)与当前读(Current Read)的差异是排查幻读问题的前提。
一、四种隔离级别对比
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED | 可能 | 可能 | 可能 |
| READ COMMITTED | 否 | 可能 | 可能 |
| REPEATABLE READ | 否 | 否 | InnoDB 下基本避免 |
| SERIALIZABLE | 否 | 否 | 否 |
二、快照读与当前读
sql
-- 快照读:读取 undo log 构建的历史版本
SELECT * FROM users WHERE id = 1;
-- 当前读:读取最新版本并加锁
SELECT * FROM users WHERE id = 1 FOR UPDATE;InnoDB 在 REPEATABLE READ 下通过间隙锁(Gap Lock)与 Next-Key Lock 阻止幻读,但快照读不受锁影响,仍可能读到事务开始时的旧快照。