mysql 命令 kill_MySQL之死锁检测

最近,笔者在查看线上服务日志时,发现spring大量异常,异常中都显示了同样的报错信息,信息如下。

Deadlock found when trying to get lock; try restarting transaction

调研之后发现是mysql发生了死锁,这也是笔者第一次遇到数据库死锁问题,详细研究后,将过程记录为文章,以便日后参考回顾。

1. 死锁

死锁指的是两个或两个以上的进程(线程)在执行的时候,因为争夺资源出现相互等待的一种现象。产生死锁需要同时满足以下四个条件

  1. 互斥条件:一个资源每次只能一个进程使用
  2. 不可抢占:进程1在获取资源,使用的过程中,进程2不能抢占进程1正在使用的资源
  3. 占有且等待:进程在申请资源的时,不能释放已经持有的资源
  4. 循环等待:进程1等待进程2资源,同时进程2等待进程1持有的资源,出现循环等待的情况

2. 死锁日志

为了查找造成死锁的sql语句,笔者通过show engine innodb status查看到最近的一次死锁日志,通过这个sql语句,我们就能确定造成死锁的事务

//事务一相关信息
*** (1) TRANSACTION:
TRANSACTION 50E, ACTIVE 66 sec starting index read
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 376, 2 row lock(s)
MySQL thread id 7, OS thread handle 0x27448, query id 82 localhost 127.0.0.1 root Updating
//当前事务正在执行的sql语句
update tb1 set c1= 10 where id =5
//以下信息记录了锁等待信息
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
//正在申请主键索引行记录的x锁
RECORD LOCKS space id 0 page no 3328 n bits 72 index `PRIMARY` of table `test`.`tb1` trx id 50E lock_mode X locks rec but not gap waiting
Record lock, heap no 5 PHYSICAL RECORD: n_fields 5; compact format; info bits 0
//事务2相关信息
*** (2) TRANSACTION:
TRANSACTION 50F, ACTIVE 47 sec starting index read
mysql tables in use 1, locked 1
3 lock struct(s), heap size 376, 2 row lock(s)
MySQL thread id 8, OS thread handle 0x277e4, query id 83 localhost 127.0.0.1 root Updating
update tb1 set c1= 10 where id =5
//正在持有的锁:主键索引为5的行记录级别的S锁
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 0 page no 3328 n bits 72 index `PRIMARY` of table `test`.`tb1` trx id 50F lock mode S locks rec but not gap
Record lock, heap no 5 PHYSICAL RECORD: n_fields 5; compact format; info bits 00: len 4; hex 80000005; asc     ;;1: len 6; hex 00000000050d; asc       ;;2: len 7; hex 8b00000d080110; asc        ;;3: len 4; hex 80000005; asc     ;;4: len 4; hex 80000005; asc     ;;*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 0 page no 3328 n bits 72 index `PRIMARY` of table `test`.`tb1` trx id 50F lock_mode X locks rec but not gap waiting
Record lock, heap no 5 PHYSICAL RECORD: n_fields 5; compact format; info bits 00: len 4; hex 80000005; asc     ;;1: len 6; hex 00000000050d; asc       ;;2: len 7; hex 8b00000d080110; asc        ;;3: len 4; hex 80000005; asc     ;;4: len 4; hex 80000005; asc     ;;WE ROLL BACK TRANSACTION (2)

笔者发现死锁日志最后一行出现了WE ROLL BACK TRANSACTION (2)信息。这是Mysql innodb引擎自动检测死锁机制,MySQL选择打断其中一个事务破坏死锁条件来消除死锁。Mysql官方文档上显示,mysql会选择杀死小的事务,这里的小指的是执行的insert,update,detected语句数目小的事务。需要注意的是mysql innodb死锁检测只能针对innodb引擎级别死锁,innodb死锁检测不能检测到应用层级别死锁

3. 死锁复现

为了避免泄露公司的业务和数据,笔者在开发环境复现了这个死锁

表结构如下所示

9d02b74199b66caa25601f7e885bb263.png

事务执行顺序如下

78b9fc9cc55e0a92555194168bf0906a.png

为什么这个sql语句会造成死锁呢?原因如下

21ce38844a6d46f88c5e9904d04a5c24.png

4. 解决方案

通过上文的死锁复现,笔者发现事务2和事务3的作用一样的,他们都操作了相同的资源,执行事务2和事务3可能是同一进程内的线程执行,也可能是位于不同进程的线程执行。针对这种情况,笔者在生产环境使用分布式锁解决这种死锁场景,笔者以操作的行记录id作为分布式资源id,关于分布式锁,可以参考笔者先前写的文章

5. 发现死锁

上述场景,Mysql发现了死锁,并选择回滚其中一个事务解决了死锁问题,但是老版本的mysql没有死锁检测机制,如果出现死锁,连接可能都会处于等待状态,直到50S的锁等待超时,这会长时间占据数据库连接,导致数据库连接池连接耗尽,tomcat无法获取数据库连接,一直处于等待状态,随后tomcat队列排满后,整个服务就会处于僵死状态,在生产环境中是非常大的事故。如果发现mysql执行SQL语句长时间不响应。我们可以通过show full processlist 命令查看当前所有数据库连接状态,如果连接在等待锁资源,在State状态会显示waiting for table metadata lock信息,同时可以通过info信息查看数据库连接执行了哪一条sql语句,如果所有的等待锁的连接执行的sql语句都涉及到了同一张表,那么就能断定哪站表发生了死锁

d04853303f82729dfb2bde5c9592064a.png

6. 查找连接

知道哪张表被锁定仍然无法解决我们的问题,我们需要知道哪个数据库连接对表加了锁,才能kill连接,从mysql5.5开始,information_schema增加了三个关于锁的表,通过这三张表,我们能够找到连接id

6.1 innodb_locks

这张表提供了各个事务请求的数据库锁但是仍然没有获取的数据库锁。这张表提供的最重要的信息是请求锁的事务id

d81fee66c7a2fb2de6077247d8cbe411.png

6.2 innodb_trx

通过这张表我们能查到当前innodb引擎执行的所有事务id以及当前执行事务的数据库连接id,于是便能通过kill命令杀死数据库连接,更关键的是我们能查找到事务正在执行的sql语句

bbe9f524521b01d1d1b026a8d3ed2dda.png

6.3 innodb_lock_waits

这张表中requesting_trx_id代表了申请锁资源的事务ID,requesting_lock_id代表申请的锁id,blocking_trx_id代表了阻塞事务70E的事务id,blocking_lock_id代表了阻塞事务70E的锁的ID

8e2cd5ef63026c8e5c855ac6f576299a.png

出现死锁后,我们可以通过innodb_lock_waits获取相互等待的事务id,通过事务id从innodb_trx查找到数据库连接id,然后使用kill杀死连接

7. 应用层死锁

innodb_locks,innodb_trx,innodb_lock_waits三张表只能查找到innodb引擎层死锁的数据库连接id,对于server层死锁就无能为力了。比如说下述命令加的锁

lock tables tb1 write;
flush tables with read lock;

针对这种死锁,无法通过杀死数据库连接id达到释放锁的目的,针对这种情况笔者尚未找到解决方案,在生产环境下,笔者也遇到过这种情况造成的死锁,笔者只能寻求DBA重启数据库可以暂时解决死锁问题,但是最好的解决方案是尽量不要使用手动加锁命令。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/490485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ char数组和char*的输入

int main(){char* s1 "abc";cin >> s1; // errorcout << s1;char s2[10]; // okcin >> s2;cout << s2;int n 10;char* s3 new char[n]; //okcin >> s3;cout << s3;return 0; }

【HTML5】Server-Sent服务器发送事件

Server-Sent 事件 - 单向消息传递 Server-Sent 事件指的是网页自动获取来自服务器的更新。 以前也可能做到这一点&#xff0c;前提是网页不得不询问是否有可用的更新。通过服务器发送事件&#xff0c;更新能够自动到达。 <!DOCTYPE html> <html> <body> <…

干货丨清华大学天机芯团队赵明国:《基于自然动力学的机器人控制——无人驾驶自行车及被动行走》...

来源&#xff1a; 机器人大讲堂8月1日&#xff0c;清华大学依托精密仪器系的类脑计算研究中心施路平教授团队在《自然》&#xff08;Nature&#xff09;杂志上发表了一篇封面文章&#xff0c;发布了一项最新研究成果——类脑计算芯片“天机芯”。同时&#xff0c;搭载天机芯&am…

C++中的深拷贝

memcmp (const void*, const void*, size_t) 第一个参数&#xff1a;目的地址 第二个参数&#xff1a;源地址 第三个参数&#xff1a;所需要复制的字节数

判断随机抽取代码_问卷调查:定量研究中的抽样问题(2)- 非随机抽样介绍

所谓抽样&#xff0c;就是从我们需要研究的所有目标群体中&#xff0c;按照某种原则&#xff0c;挑选出一定量的样本&#xff0c;用他们的研究结果&#xff0c;代表目标群体整体结果。既然&#xff0c;抽样的目的是通过对一部分被选择的样本来推断总体&#xff0c;就要求我们抽…

解决保存快照失败后redis无法写入的问题( Redis is configured to save RDB snapshots)

MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.解决方案&#xff1a;Just too brief about answer. open t…

欧洲估值最高的5家人工智能创业公司

来源&#xff1a;资本实验室今年初&#xff0c;据伦敦风险投资公司MMC的调查&#xff0c;四成自称为人工智能公司的欧洲创业公司实际上并未在核心业务中涉及到人工智能&#xff0c;人工智能仅为吸引投资的漂亮外衣。这一数据发布后&#xff0c;激起了轩然大波&#xff0c;不仅引…

seaborn画图设置横纵坐标标签

用seaborn库来画图&#xff0c;也同样可以通过matplotlib.pyplot.xlabel设置x轴标签&#xff0c;而matplotlib.pyplot.ylabel设置当前轴的y轴标签 举个例子&#xff1a; import seaborn as sns import matplotlib.pyplot as pltsns.kdeplot(data) plt.xlabel("xxxxxx&qu…

keras安装_代码详解:构建一个简单的Keras+深度学习REST API

在本教程中&#xff0c;我们将介绍一个简单的方法来获取Keras模型并将其部署为REST API。本文所介绍的示例将作为你构建自己的深度学习API的模板/起点——你可以扩展代码&#xff0c;根据API端点的可伸缩性和稳定性对其进行定制。具体而言&#xff0c;我们将了解&#xff1a; 如…

移植memtester到android平台

硬件搭建起来能进入系统&#xff0c;首要就是测试内存的稳定性&#xff0c;需要一款内存测试工具。 一般都是选择memtester这款linux软件&#xff0c;下载地址如下&#xff1a;http://pyropus.ca/software/memtester/ 把memtester解压到android/external/下&#xff08;此文默认…

马云对话马斯克(全文):要警惕AI?该移民火星?如何更长寿?马化腾反对产业割裂和技术脱钩...

来源&#xff1a;未来论坛今天&#xff08;8月29日&#xff09;&#xff0c;2019年世界人工智能大会在上海召开&#xff0c;500余位国内外顶尖高校、行业领军企业、国际组织的重要嘉宾&#xff0c;全球AI知名企业领袖齐聚于此。本次大会以“智联世界&#xff0c;无限可能”为主…

给plt.axvline设置图例(label)

plt.axvline的其中一个参数是label&#xff0c;用于给这条垂直线设置标签。但加上后就是不显示这个这个图例&#xff0c;代码如下&#xff1a; sns.kdeplot(data) plt.axvline(-2, colorr, linestyle--, label0.9) plt.show() 原因会因为没有加这一句&#xff1a; plt.legend…

C#中break,continue,return,,goto,throw的区别(转)

break 语句用于终止最近的封闭循环或它所在的switch 语句。 控制传递给终止语句后面的语句&#xff08;如果有的话&#xff09;。 /// <summary>/// break 示例/// 在此例中&#xff0c;条件语句包含一个应该从 1 计数到 100 的计数器/// 但 break 语句在计数达到 4…

python excel 转json_Python办公自动化| word 表格转excel

之前写过一篇 Python办公自动化 | 批量word报告生成工具 &#xff0c;有小伙伴提出了逆向需求&#xff0c;即&#xff1a;从批量word中获取内容并写入excel&#xff0c;需求背景是汇总一些材料&#xff0c;举例&#xff1a;实习鉴定表、个人简历、档案等。实际需求是这样的&…

python在图中画一条垂直线(matplotlib)

matplotlib.pyplot.axvline https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.axvline.html?highlightaxvline#matplotlib.pyplot.axvline 用法&#xff1a; plt.axvline(x, colorr, linestyle--, labelxxx) plt.legend()

坦途与波折:我们需要什么样的人工智能?

来源&#xff1a;资本实验室历史车轮滚滚向前&#xff0c;如今我们正在进入人工智能时代。其中的坦途足以让我们乐观和振奋&#xff0c;其中的波折也可能会让我们不安或担忧。面对未来&#xff0c;我们需要坚持三个基本要点&#xff1a;效率、环保与福祉。1.人工智能与传统产业…

python画一条水平直线(matplotlib)

matplotlib.pyplot.axhline https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.axhline.html 用法&#xff1a; plt.axhline(0.06, colorr, linestyle--, labelxxx) plt.legend(locupper left)

我该如何维护一个烂项目?

最近接手了一个很烂的项目&#xff0c;前后3批人开发。A开发一段时间&#xff0c;不知什么原因离职了&#xff0c;交接给了B&#xff1b;B也是开发一段时间&#xff0c;又是未知原因离职了&#xff0c;交接给C&#xff1b;C也是同样的手法交给了我。我一接手&#xff0c;发现了…

sql数字转换为字符_Python|图片转换为字符画^_^

我们很清楚什么是图片&#xff0c;无外乎png、jpg等格式的文件&#xff0c;例如这个?但什么是字符画呢&#xff1f;先看一下官方介绍&#xff1a;字符画&#xff0c;一种由字母、标点、汉字或其他字符组成的图画。简单的字符画是利用字符的形状代替图画的线条来构成简单的人物…

全球机器人产业趋势及特征

来源&#xff1a;创新研究当前&#xff0c;全球机器人市场规模持续扩大&#xff0c;工业机器人市场增速回落&#xff0c;服务、特种机器人增速稳定。技术创新围绕仿生结构、人工智能和人机协作不断深入&#xff0c;产品在教育陪护、医疗康复、危险环境等领域的应用持续拓展&…