后端岗位面试题更新 2026-08-05

在MySQL里遇到死锁情况时,有哪些处理手段和预防措施?

后端开发风险判断技术原理问题排查MySQL

考察说明

考查对MySQL死锁原理、检测机制及解决与预防策略的掌握程度。

回答思路

  1. 【回答框架 1】死锁是两个或多个事务互相持有并等待对方持有的锁,导致循环等待。InnoDB通过等待图(wait-for graph)检测死锁,并回滚代价较小的事务来解除,同时抛出错误1213。
  2. 【回答框架 2】现场处理:先通过SHOW ENGINE INNODB STATUS查看最近死锁信息,定位涉及的表、行和SQL;分析事务加锁顺序;临时缓解可终止阻塞事务或调整隔离级别(如降低为读已提交),但需评估业务影响。
  3. 【回答框架 3】根本解决:优化事务逻辑,统一加锁顺序,缩短事务执行时间,减少锁范围(如使用索引避免全表锁),合理设计索引减小锁粒度,必要时使用表锁或应用层串行化控制并发。
  4. 【回答框架 4】预防措施:监控死锁日志,定期分析锁等待;使用乐观锁或版本控制减少锁冲突;对于热点资源,可考虑分片或异步化降低并发竞争。
  5. 【回答框架 5】处理过程中需注意:死锁回滚是自动发生的,但业务需捕获1213错误并重试事务;不要依赖超时机制,因为InnoDB默认不会因锁等待超时而自动回滚(需配置innodb_lock_wait_timeout)。
  6. 【关键点 1】InnoDB自动检测死锁并回滚最小代价事务,返回错误1213。
  7. 【关键点 2】通过SHOW ENGINE INNODB STATUS分析死锁日志。
  8. 【关键点 3】优化加锁顺序和事务时间可减少死锁概率。
  9. 【关键点 4】降低隔离级别可减少锁冲突,但可能引入其他一致性问题。
  10. 【关键点 5】业务需捕获死锁错误并实现重试逻辑。
  11. 【易错点 1】误以为死锁只能通过代码避免,忽略数据库自动检测机制。
  12. 【易错点 2】直接调大锁等待超时时间,可能掩盖设计问题。
  13. 【易错点 3】错误认为降低隔离级别是万能方案,忽略可能带来的脏读或不可重复读风险。