mysql8 死锁_如何减少和处理死锁 - MySQL 8.0官方文档笔记(四)

本文详细介绍了MySQL 8.0中如何处理和减少死锁的发生,包括通过SHOW ENGINE INNODB STATUS排查原因、设置innodb_print_all_deadlocks进行调试、事务的短小与及时提交、有序操作、合理设计索引以及使用表锁和信号量表等策略。
摘要由CSDN通过智能技术生成

本篇介绍如何减少死锁的发生,以及出现死锁时如何处理。

死锁指不同的事务因彼此持有对方等待的锁而不能继续执行的情形。因双方都在等待资源释放,任意一方都不会释放已有的锁。

正文

死锁是事务形数据库中的经典问题,但只要死锁的发生不会频繁到完全不能执行某个事务,那么就不算危险。通常,当事务因死锁而回滚时,你需要让你的应用随时做好重新发送事务的准备。

InnoDB引擎默认使用行锁。即使在事务中插入或删除单行数据,也能触发死锁。因为这些操作并不是真正的“原子的”,在插入或删除时它们会给行的索引值(可能有多个)上锁。

在前面的 InnoDB中的锁 中解释过:在默认级别REPEATABLE READ下,InnoDB在搜索和扫描索引时使用邻键锁,用于避免幻行。此时InnoDB会无视Where条件的过滤,给每个扫描到的索引值及其间隙上锁。此策略适用于加锁读、INSERT、DELETE,但有一个特殊场景只会上记录锁不会上间隙锁:WHERE条件中涵盖了唯一索引。

通过以下技巧,你可以处理好死锁,并减少其发生的概率:

随时使用SHOW ENGINE INNODB STATUS找出最近发生死锁的原因,以便调整应用规避死锁。

如果频繁的死锁警告惹人注目,开启innodb_print_all_deadlocks选项以收集额外的调试信息。在MySQL的错误日志中会记录每次死锁的信息,而不仅仅记录最后一次。完成调试后关闭这个选项。

随时准备好重启因死锁而失败的事务。死锁并不危险,重试就好了。

保持事务的短小精悍,以降低冲突的可能性。

做出一系列关联变更后立即提交事务,以降低冲突的可能性。特别是不要让有关联的MySQL会话长

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值