关于MySQL死锁问题的深入分析


前言如果我们的业务处在一个非常初级的阶段,并发程度比较低,那么我们可以几年都遇不到一次死锁问题的发生,反之,我们业务的并发程度非常高,那么时不时爆出的死锁问题肯定让我们非常挠头。不过在死锁问题发生时,很多没有经验的同学的第一反应就是成为一只鸵鸟:这玩意儿很高深,我也看不懂,听天由命吧,又不是一直发生。其实如果大家认真研读了我们之前写的3篇关于MySQL中语句加锁分析的文章,加上本篇关于死锁日志的分析,那么解决死锁问题应该也不是那么摸不着头脑的事情了。
准备工作
为了故事的顺利发展,我们需要建一个表:
我们为hero表的id列创建了聚簇索引,为name列创建了一个二级索引。这个hero表主要是为了存储三国时的一些英雄,我们向表中插入一些记录:
现在表中的数据就是这样的:
准备工作就做完了。
创建死锁情景
我们先创建一个发生死锁的情景,在Session A和Session B中分别执行两个事务开发云主机域名,具体情况如下:我们分析一下:ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
以上是我们从语句加了什么锁的角度出发来进行死锁情况分析的,但是实际应用中我们可能压根儿不知道到底是哪几条语句产生了死锁,我们需要根据MySQL在死锁发生时产生的死锁日志来逆向定位一下到底是什么语句产生了死锁,从而再优化我们的业务。
查看死锁日志
设计InnoDB的大叔给我们提供了SHOW ENGINE INNODB STATUS命令来查看关于InnoDB存储引擎的一些状态信息,其中就包括了系统最近一次发生死锁时的加锁情况。在上边例子中的死锁发生时,我们运行一下这个命令:
我们只关心最近发生的死锁信息,所以就把以LATEST DETECTED DEADLOCK这一部分给单独提出来分析一下。下边我们就逐行看一下这个输出的死锁日志都是什么意思:首先看第一句:
2019-06-20 13:39:19 0x70000697e000
这句话的意思就是死锁发生的时间是:2019-06-20 13:39:19,后边的一串十六进制0x70000697e000表示的操作系统为当前session分配的线程的线程id。然后是关于死锁发生时第一个事务的有关信息:
从这个信息中可以看出,Session A中的事务为2条记录生成了锁结构,但是其中有一条记录上的X型正经记录锁(rec but not gap)并没有获取到,没有获取到锁的这条记录的位置是:表空间ID为151,页号为3,heap_no为2。当然,设计InnoDB的大叔还贴心的给出了这条记录的详细情况,它的主键值为80000003,这其实是InnoDB内部存储使用的格式,其实就代表数字3,也就是该事务在等待获取hero表聚簇索引主键值为3的那条记录的X型正经记录锁。然后是关于死锁发生时第二个事务的有关信息:
其中的大部分信息我们都已经介绍过了,我们就挑重要的说:
从上边的输出可以看出来,Session B中的事务获取了hero表聚簇索引主键值为3的记录的X型正经记录锁,等待获取hero表聚簇索引主键值为1的记录的X型正经记录锁(隐含的意思就是这个hero表聚簇索引主键值为1的记录的X型正经记录锁已经被SESSION A中的事务获取到了)。看最后一部分:
最终InnoDB存储引擎决定回滚第2个事务,也就是Session B中的那个事务。死锁分析的思路1、查看死锁日志时,首先看一下发生死锁的事务等待获取锁的语句都是啥。
本例中,发现SESSION A发生阻塞的语句是:
SESSION B发生阻塞的语句是:
然后切记:到自己的业务代码中找出这两条语句所在事务的其他语句。2、找到发生死锁的事务中所有的语句之后,对照着事务获取到的锁和正在等待的锁的信息来分析死锁发生过程。
从死锁日志中可以看出来,SESSION A获取了hero表聚簇索引id值为1的记录的X型正经记录锁(这其实是从SESSION B正在等待的锁中获取的),查看SESSION A中的语句,发现是下边这个语句造成的(对照着语句加锁分析那三篇文章):
还有SESSION B获取了hero表聚簇索引id值为3的记录的X型正经记录锁,查看SESSION B中的语句,发现是下边这个语句造成的(对照着语句加锁分析那三篇文章):
然后看SESSION A正在等待hero表聚簇索引id值为3的记录的X型正经记录锁,这个是由于下边这个语句造成的:
然后看SESSION B正在等待hero表聚簇索引id值为1的记录的X型正经记录锁,这个是由于下边这个语句造成的:
然后整个死锁形成过程就根据死锁日志给还原出来了。总结以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对开发云的支持。

相关推荐: Percona Audit Log Plugin实现对mysql 审计的操作步骤

下文给大家带来有关Percona Audit Log Plugin实现对mysql 审计的操作步骤内容,相信大家一定看过类似的文章。我们给大家带来的有何不同呢?一起来看看正文部分吧,相信看完Percona Audit Log Plugin实现对mysql 审计…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 06/09 21:31
下一篇 06/09 21:31

相关推荐