标准答案

  1. 典型死锁是事务 A 先锁订单再锁库存,事务 B 先锁库存再锁订单,双方互相等待。
  2. 数据库回滚一个受害者事务是为了让系统继续前进,不代表数据库出现了数据损坏。
  3. 统一多资源访问顺序、缩短事务、使用合适索引和减少不必要锁范围能降低死锁概率。
  4. 应用要捕获可识别的死锁错误,记录 SQL 与事务上下文,并只对幂等或可安全重放的单元做退避重试。
  5. 高频死锁应查看锁等待图和业务热点,不能只靠无限重试掩盖。

题目解析

死锁与普通锁等待不同:普通等待最终可能会在持锁事务提交后继续,死锁没有外部动作就无法自行解除。数据库选择一个事务回滚是必要的抢救机制。

修复重点通常是让并发事务以一致顺序访问同类资源,并避免在事务内做慢操作。若两个流程确实需要不同顺序,还要重新审视边界或通过队列、状态机拆解竞争。

常见误区

  • 把死锁等同于“数据库锁太多”,不收集哪两个语句、哪两个索引范围互相等待。
  • 对非幂等扣款、发券操作直接自动重试,造成业务重复。

作者信息