第 09 篇 快照读 vs 当前读:为什么 RR 下依然可能出现幻读
开篇钩子
教科书说 REPEATABLE READ 解决了幻读。但下面这个实验,在 5.7 的 RR 下,会让同一个事务两次查询看到不同的行数——这不是 bug,是快照读与当前读混用的必然结果。理解这个边界,是从"会用事务"到"真正懂事务"的分水岭。
1. 两种读的分界线
InnoDB 里的读操作分为两大类,分界线清晰:
| 类型 | 语句 | 读取目标 | 是否加锁 |
|---|---|---|---|
| 快照读 | 普通SELECT | ReadView 里的历史版本 | 不加锁 |
| 当前读 | SELECT ... FOR UPDATE | 最新已提交版本 | 加排他锁 |
| 当前读 | SELECT ... LOCK IN SHARE MODE | 最新已提交版本 | 加共享锁 |
| 当前读 | UPD |
