wait-die 和 wound-wait 怎么记
两种都是死锁预防:按事务开始的时间戳分老少,申请锁被挡住时,按规则决定等还是回滚。
名字的读法是「老的去申请时怎么做 - 小的去申请时怎么做」:
| 老的申请、被小的挡住 | 小的申请、被老的挡住 | |
|---|---|---|
| wait-die | 等(wait) | 自己回滚(die) |
| wound-wait | 把小的回滚掉(wound) | 等(wait) |
两条共同点:被回滚的永远是年轻的;等待只朝一个方向,所以连不成环。被回滚的事务保留原来的时间戳重启,迟早会变成最老的,不会饿死。
InnoDB 两种都没用,它只做死锁检测(等待图)加超时兜底,发现死锁时挑改动行数少的事务回滚。wound-wait 在分布式数据库里更常见,Google Spanner 用的就是它。