标准答案
- 多个执行者互相持有对方需要的锁时会形成循环等待,所有执行者都无法继续。
- 对多个资源按稳定全局顺序获取,能破坏循环等待;事务和锁的访问顺序也应统一。
- 减少临界区、避免嵌套锁、使用超时和让数据库回滚一个事务,可以降低长期占用风险。
- 发生死锁时要记录锁图、事务 SQL 和资源顺序,不能只盲目重试。
题目解析
死锁的四个必要条件是互斥、占有且等待、不可剥夺和循环等待。工程上最有效的预防通常是统一资源顺序、缩短事务和避免在持锁期间调用不可控的外部依赖。
数据库检测到死锁后通常会回滚其中一个事务,应用看到的是一次失败而不是“锁已经自动修好”。重试前要判断操作是否幂等,并保留原始锁图和事务信息。
锁超时可以保护请求预算,但不能替代根因修复。告警应包含阻塞者、等待者、资源顺序、事务开始时间和 SQL,才能把偶发死锁变成可修复的代码路径。
常见误区
- 误区:加更多锁就能避免死锁。改正:锁越多越可能形成循环等待,应减少锁数量并统一获取顺序。
- 误区:所有死锁都无限重试。改正:限制次数和总预算,确认重试不会重复副作用,并优先修复锁顺序。
- 误区:只记录“deadlock detected”日志。改正:保存锁等待图、事务边界和 SQL,才能定位哪两条路径形成循环。