数据库

脏读、不可重复读、幻读,一句话分清

按冲突类型来记:

冲突异常一句话
写 → 读脏读读到别人还没提交的值,对方一回滚,你读到的就不存在了
读 → 写不可重复读我读过 A,别人改了 A 并提交,我再读值变了
写 → 写丢失更新两人都读到 1000、各加 100 写回,最后只有 1100

幻读不在这张表里:同一个条件(如 WHERE age > 20)查两次,第二次多出了别人新插入的行。它和范围有关,单行的读写冲突描述不了。InnoDB 在 RR 下靠快照(普通读)和间隙锁(锁定读)防它。

两个容易混的点:

  • 写读冲突不一定是脏读。对方已经提交了你再读,就是正常读到新值。
  • 脏读在读的那一刻就发生了,和对方后来有没有回滚无关。
esc