标准答案
- 典型死锁是事务 A 先锁订单再锁库存,事务 B 先锁库存再锁订单,双方互相等待。
- 数据库回滚一个受害者事务是为了让系统继续前进,不代表数据库出现了数据损坏。
- 统一多资源访问顺序、缩短事务、使用合适索引和减少不必要锁范围能降低死锁概率。
- 应用要捕获可识别的死锁错误,记录 SQL 与事务上下文,并只对幂等或可安全重放的单元做退避重试。
- 高频死锁应查看锁等待图和业务热点,不能只靠无限重试掩盖。
题目解析
死锁与普通锁等待不同:普通等待最终可能会在持锁事务提交后继续,死锁没有外部动作就无法自行解除。数据库选择一个事务回滚是必要的抢救机制。
修复重点通常是让并发事务以一致顺序访问同类资源,并避免在事务内做慢操作。若两个流程确实需要不同顺序,还要重新审视边界或通过队列、状态机拆解竞争。
常见误区
- 把死锁等同于“数据库锁太多”,不收集哪两个语句、哪两个索引范围互相等待。
- 对非幂等扣款、发券操作直接自动重试,造成业务重复。