数据库

wait-die 和 wound-wait 怎么记

两种都是死锁预防:按事务开始的时间戳分老少,申请锁被挡住时,按规则决定等还是回滚。

名字的读法是「老的去申请时怎么做 - 小的去申请时怎么做」:

老的申请、被小的挡住小的申请、被老的挡住
wait-die等(wait)自己回滚(die)
wound-wait把小的回滚掉(wound)等(wait)

两条共同点:被回滚的永远是年轻的;等待只朝一个方向,所以连不成环。被回滚的事务保留原来的时间戳重启,迟早会变成最老的,不会饿死。

InnoDB 两种都没用,它只做死锁检测(等待图)加超时兜底,发现死锁时挑改动行数少的事务回滚。wound-wait 在分布式数据库里更常见,Google Spanner 用的就是它。

esc