脏读、不可重复读、幻读,一句话分清
按冲突类型来记:
| 冲突 | 异常 | 一句话 |
|---|---|---|
| 写 → 读 | 脏读 | 读到别人还没提交的值,对方一回滚,你读到的就不存在了 |
| 读 → 写 | 不可重复读 | 我读过 A,别人改了 A 并提交,我再读值变了 |
| 写 → 写 | 丢失更新 | 两人都读到 1000、各加 100 写回,最后只有 1100 |
幻读不在这张表里:同一个条件(如 WHERE age > 20)查两次,第二次多出了别人新插入的行。它和范围有关,单行的读写冲突描述不了。InnoDB 在 RR 下靠快照(普通读)和间隙锁(锁定读)防它。
两个容易混的点:
- 写读冲突不一定是脏读。对方已经提交了你再读,就是正常读到新值。
- 脏读在读的那一刻就发生了,和对方后来有没有回滚无关。