[Note] InnoDB: Transactions deadlock detected, dumping detailed

举报
赵KK日常技术记录 发表于 2023/06/25 10:45:31 2023/06/25
【摘要】 Mysql死锁的产生原因主要有:事务隔离级别问题:当使用READ UNCOMMITTED或READ COMMITTED隔离级别时,脏读或不可重复读会导致死锁。锁的请求顺序问题:一个事务获取了A锁,另一个事务获取了B锁。当第一个事务再请求B锁、第二个事务再请求A锁时,产生死锁。表锁和行锁混用问题:一个事务使用表锁,一个事务使用行锁。行锁会阻塞表锁,表锁会阻塞行锁,最终产生死锁。锁的释放顺序问题...

Mysql死锁的产生原因主要有:

  1. 事务隔离级别问题:当使用READ UNCOMMITTED或READ COMMITTED隔离级别时,脏读或不可重复读会导致死锁。

  2. 锁的请求顺序问题:一个事务获取了A锁,另一个事务获取了B锁。当第一个事务再请求B锁、第二个事务再请求A锁时,产生死锁。

  3. 表锁和行锁混用问题:一个事务使用表锁,一个事务使用行锁。行锁会阻塞表锁,表锁会阻塞行锁,最终产生死锁。

  4. 锁的释放顺序问题:一个事务在释放A锁后去获取B锁,这时另一个事务已经获取了B锁。当这个事务释放B锁去获取A锁时,等待A锁的第一个事务已经结束,产生死锁。

  5. 刻意设计造成死锁的应用逻辑。

解决Mysql中事务死锁的方案有:

  1. 避免读未提交隔离级别,使用RC或RR隔离级别。

  2. 统一锁的申请顺序,所有事务都按相同顺序申请锁,避免请求顺序死锁。

  3. 避免混用表锁和行锁,使用绑定的锁机制,要么只使用表锁,要么只使用行锁。

  4. 释放所有锁之后再获取新的锁,避免持有部分锁时再申请新的锁导致死锁。

  5. 优化应用程序逻辑,避免刻意设计导致死锁的逻辑。重构这部分逻辑。

  6. 死锁发生时,强制回滚其中一个事务释放对应的锁。MySQL通过innodb_lock_wait_timeout参数设置等待锁的超时时间,超时后会回滚事务。

  7. 正确设置锁的超时时间,不宜设置太长时间,设置短一些时间后回滚重试。

  8. 改用乐观锁机制,避免使用行锁与表锁,这样可以减少锁冲突与死锁问题。

  9. 如果出现死锁,分析各事务的锁定资源与运行逻辑,重新设计逻辑与加锁顺序来解决问题。

InnoDB引擎的事务死锁检测会抛出Transactions deadlock detected, dumping detailed information错误。这表示有两个事务因争夺锁资源而产生了死锁。

解决InnoDB事务死锁的方法有:

  1. 调整锁的申请顺序:导致死锁的主要原因是两个事务以不同顺序申请了对方持有的锁。可以通过统一所有的事务锁申请顺序来避免这种情况,要么全部按主键升序加锁,要么全部按主键降序加锁。

  2. 缩小锁的申请范围:可以通过锁分段的方式,仅锁定必要的资源来减小锁冲突的范围,避免大范围锁定导致的死锁。

  3. 使用锁超时机制:通过设置innodb_lock_wait_timeout来指定锁等待超时时间,超过这个时间InnoDB会回滚事务释放锁,这样可以避免长时间的死锁阻塞。可以设置较短时间,让事务快速失败重试。

  4. 隔离级别选择:使用RC或RR隔离级别可以避免脏读与不可重复读导致的死锁,避免使用READ UNCOMMITTED级别。

  5. 增加死锁检测频率:通过设置innodb_deadlock_detect参数来控制InnoDB死锁检测线程运行频率,增加频率可以快速检测到死锁,但会增加服务器负载。需权衡设置。

  6. 使用乐观锁:使用版本号机制的乐观锁可以避免悲观锁制引起的死锁问题,适合写少读多的场景。

  7. 分析日志找出根源:InnoDB会在错误日志中Dump出死锁的详细信息,包括事务ID、锁定资源等,通过分析这个信息可以找到导致死锁的根源,然后重构逻辑解决问题。

  8. 重构业务逻辑:某些业务逻辑中的锁申请顺序容易产生死锁,需要重新设计这部分逻辑,调整锁申请的顺序与范围来彻底解决死锁问题。

  9. 提高并发意识:应用程序开发人员应提高对并发控制与锁机制的意识,在设计时就考虑到并发与锁的问题,这可以最大限度地减少死锁的产生。

解决InnoDB事务死锁问题,需要从加锁顺序优化、锁粒度调整、锁超时设置、隔离级别选择、死锁检测优化以及业务逻辑重构等多个角度施加综合预防与治理。同时,开发人员也应提高对这方面的意识,在设计时就考虑并发控制来避免相关问题。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。