死锁问题排查

记录排查一次线上的死锁问题 死锁问题出现 某天下午突然接到报警说是出现了死锁,当时的日志是这样的 问题排查 我们先来回顾一下死锁出现的条件 1、循环等待 2、互斥 此时看了下发布记录最近并没有什么功能上线,首先排除是上线代码质量问题引起的死锁。 之后查看当时日志定位死锁发生在业务线同步请求的后处理环节,后处理环节涉及到该张表操作的一共有三个环节:同步请求环节,合作... 阅读详情

mysql数据库版本:5.7,事务隔离级别是默认的RR(Repeatable-Read),采⽤innodb引擎。

假设存在test表:

CREATE TABLE `test` (

  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,

  `a` int(11) unsigned DEFAULT NULL,

  PRIMARY KEY (`id`),

  UNIQUE KEY `a` (`a`)
)

表的结构很简单,一个主键id,另一个唯一索引a。表里的数据如下:

mysql> select * from test;

+----+------+

| id | a    |

+----+------+

|  1 |    1 |

|  2 |    2 |

|  4 |    4 |

+----+------+

3 rows in set (0.00 sec)

出现死锁的操作如下:

步骤事务1事务2
1begin
2delete from test where a = 2;
3begin
4delete from test where a = 2; (事务1卡住)
5提示出现死锁:ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transactioninsert into test (id, a) values (10, 2);

然后我们可以通过 SHOW ENGINE INNODB STATUS; 来查看死锁日志:

------------------------

LATEST DETECTED DEADLOCK

------------------------

170219 13:31:31

*** (1) TRANSACTION:

TRANSACTION 2A8BD, ACTIVE 11 sec starting index read

mysql tables in use 1, locked 1

LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 448218, OS thread handle 0x2abe5fb5d700, query id 18923238 renjun.fangcloud.net 121.41.41.92 root updating

delete from test where a = 2

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 0 page no 923 n bits 80 index `a` of table `oauthdemo`.`test` trx id 2A8BD lock_mode X waiting

Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32

 0: len 4; hex 00000002; asc     ;;

 1: len 4; hex 00000002; asc     ;;



*** (2) TRANSACTION:

TRANSACTION 2A8BC, ACTIVE 18 sec inserting

mysql tables in use 1, locked 1

4 lock struct(s), heap size 1248, 3 row lock(s), undo log entries 2

MySQL thread id 448217, OS thread handle 0x2abe5fd65700, query id 18923239 renjun.fangcloud.net 121.41.41.92 root update

insert into test (id,a) values (10,2)

*** (2) HOLDS THE LOCK(S):

RECORD LOCKS space id 0 page no 923 n bits 80 index `a` of table `oauthdemo`.`test` trx id 2A8BC lock_mode X locks rec but not gap

Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32

 0: len 4; hex 00000002; asc     ;;

 1: len 4; hex 00000002; asc     ;;



*** (2) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 0 page no 923 n bits 80 index `a` of table `oauthdemo`.`test` trx id 2A8BC lock mode S waiting

Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32

 0: len 4; hex 00000002; asc     ;;

 1: len 4; hex 00000002; asc     ;;


*** WE ROLL BACK TRANSACTION (1)

分析

阅读死锁日志

遇到死锁,第一步就是阅读死锁日志。死锁日志通常分为两部分,上半部分说明了事务1在等待什么锁:

170219 13:31:31

*** (1) TRANSACTION:

TRANSACTION 2A8BD, ACTIVE 11 sec starting index read

mysql tables in use 1, locked 1

LOCK WAIT 2 lock struct(s), heap size 376, 1 row lock(s)

MySQL thread id 448218, OS thread handle 0x2abe5fb5d700, query id 18923238 renjun.fangcloud.net 121.41.41.92 root updating

delete from test where a = 2

*** (1) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 0 page no 923 n bits 80 index `a` of table `oauthdemo`.`test` trx id 2A8BD lock_mode X waiting

Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32

 0: len 4; hex 00000002; asc     ;;

 1: len 4; hex 00000002; asc     ;;

从日志里我们可以看到事务1当前正在执行 delete from test where a = 2 ,该条语句正在申请索引a的X锁,所以提示 lock_mode X waiting 。

然后日志的下半部分说明了事务2当前持有的锁以及等待的锁:

*** (2) TRANSACTION:

TRANSACTION 2A8BC, ACTIVE 18 sec inserting

mysql tables in use 1, locked 1

4 lock struct(s), heap size 1248, 3 row lock(s), undo log entries 2

MySQL thread id 448217, OS thread handle 0x2abe5fd65700, query id 18923239 renjun.fangcloud.net 121.41.41.92 root update

insert into test (id,a) values (10,2)

*** (2) HOLDS THE LOCK(S):

RECORD LOCKS space id 0 page no 923 n bits 80 index `a` of table `oauthdemo`.`test` trx id 2A8BC lock_mode X locks rec but not gap

Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32

 0: len 4; hex 00000002; asc     ;;

 1: len 4; hex 00000002; asc     ;;



*** (2) WAITING FOR THIS LOCK TO BE GRANTED:

RECORD LOCKS space id 0 page no 923 n bits 80 index `a` of table `oauthdemo`.`test` trx id 2A8BC lock mode S waiting

Record lock, heap no 3 PHYSICAL RECORD: n_fields 2; compact format; info bits 32

 0: len 4; hex 00000002; asc     ;;

 1: len 4; hex 00000002; asc     ;;

从日志的 HOLDS THE LOCKS(S) 块中我们可以看到事务2持有索引a的X锁,并且是记录锁(Record Lock)。该锁是通过事务2在步骤2执行的delete语句申请的。由于是RR隔离模式下的基于唯一索引的等值查询(Where a = 2),所以会申请一个记录锁,而非next-key锁。

从日志的 WAITING FOR THIS LOCK TO BE GRANTED 块中我们可以看到事务2正在申请S锁,也就是共享锁。该锁是 insert into test (id,a) values (10,2) 语句申请的。 insert语句在普通情况下是会申请排他锁,也就是X锁,但是这里出现了S锁。这是因为a字段是一个唯一索引,所以insert语句会在插入前进行一次duplicate key的检查,为了使这次检查成功,需要申请S锁防止其他事务对a字段进行修改。

那么为什么该S锁会失败呢?这是 对同一个字段的锁的申请是需要排队的 。S锁前面还有一个未申请成功的X锁,所以S锁必须等待,所以形成了循环等待,死锁出现了。

通过阅读死锁日志,我们可以清楚地知道两个事务形成了怎样的循环等待,再加以分析,就可以逆向推断出循环等待的成因,也就是死锁形成的原因。

死锁形成流程图

为了让大家更好地理解死锁形成的原因,我们再通过表格的形式阐述死锁形成的流程:

步骤事务1事务2
1begin
2delete from test where a = 2; 执行成功,事务2占有a=2下的X锁,类型为记录锁。
3begin
4delete from test where a = 2; 事务1希望申请a=2下的X锁,但是由于事务2已经申请了一把X锁,两把X锁互斥,所以X锁申请进入锁请求队列。
5出现死锁,事务1权重较小,所以被选择回滚(成为牺牲品)。insert into test (id, a) values (10, 2); 由于a字段建立了唯一索引,所以需要申请S锁以便检查duplicate key,由于插入的a的值还是2,所以排在X锁后面。但是前面的X锁的申请只有在事务2commit或者rollback之后才能成功,此时形成了循环等待,死锁产生。

拓展

在排查死锁的过程中,还发现了上述场景会产生另一种死锁,该场景无法通过手工复现,只有高并发场景下才有可能复现。

该死锁对应的日志这里就不贴出了,与上一个死锁的核心差别是事务2等待的锁从S锁换成了X锁,也就是 lock_mode X locks gap before rec insert intention waiting 。我们还是通过表格来详细说明该死锁产生的流程:

步骤事务1事务2
1begin
2delete from test where a = 2; 执行成功,事务2占有a=2下的X锁,类型为记录锁。
3begin
4【insert第1阶段】insert into test (id, a) values (10, 2); 事务2申请S锁进行duplicate key进行检查。检查成功。
5delete from test where a = 2; 事务1希望申请a=2下的X锁,但是由于事务2已经申请了一把X锁,两把X锁互斥,所以X锁申请进入锁请求队列。
6出现死锁,事务1权重较小,所以被选择回滚(成为牺牲品)。【insert第2阶段】insert into test (id, a) values (10, 2); 事务2开始插入数据,S锁升级为X锁,类型为insert intention。同理,X锁进入队列排队,形成循环等待,死锁产生。

总结

排查死锁时,首先需要根据死锁日志分析循环等待的场景,然后根据当前各个事务执行的SQL分析出加锁类型以及顺序,逆向推断出如何形成循环等待,这样就能找到死锁产生的原因了。

从建模到调参:基于Simulink的两轮差速机器人轨迹跟踪PID控制全流程解析 本文详细解析了基于Simulink的两轮差速机器人轨迹跟踪PID控制全流程。从运动学建模入手,对比了基于距离与基于位置偏差的两种控制策略,并重点阐述了高精度轨迹跟踪的控制器设计、Simulink仿真搭建及PID参数整定方法,为移动机器人运动控制提供了完整的仿真实践指南。 阅读详情

相关推荐

【AWS】创建aws云服务器EC2实例

本文介绍了如何创建aws的EC2云服务器,并介绍了如何使用Xshell远程连接上云服务器

Marcos921的博客 2502

死锁是什么?如何避免?如何排查?为什么这样排查 详细总结

1.定位线程+代码行 需要找到哪行代码发生了死锁 因此需要找到出问题的线程thread 1切换线程bt查看线程的堆栈调用)2.全部线程 那么就需要先查看所有线程的堆栈调用情况3.跟踪进程 使用attach跟踪进程sudogbd进程号确定其中线程具体工作4.确定是否死锁查看具体进程内存占用 确定是否发生了死锁5.查看进程状态 确定进程号ps。

weixin_57672347的博客 2585

Mac---安装Navicat

把这个填充好的字符串放入刚才打开的RSA在线加解密的网站中的第二个框框(替换之前的请求码),第一个框框不动(还是之前第10步骤中的私钥),点击RSA私钥加密,这时会得到一个加密的字符串,这个就是激活码。{“K”:“你的K值”, “N”:“52pojie”, “O”:“52pojie.cn”, “DI”:“你的DI值”, “T”:你的时间戳}链接: https://pan.baidu.com/s/1mEVY4hnKdktg-p7DBIfD7A 提取码: twwg。Navicat会弹出一个对话框,点击“注册”

weixin_53970868的博客 1万+

一个 Linux 上分析死锁的简单方法

一个 Linux 上分析死锁的简单方法 于 东海, 宋 波, 和 池 辰 2012 年 8 月 10 日发布 https://www.ibm.com/developerworks/cn/linux/l-cn-deadlock/index.html 简介 死锁 (deallocks): 是指两个或两个以上的进程(线程)在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程(线程)称为死锁进程(线程)。 由

u014426028的博客 812

D触发器(D Flip-Flop)与D锁存器(D Latch)

在解释这个练习题之前,我们先来简单回顾一下D触发器(D flip-flop)和D锁存器(D latch)的概念,以及它们在数字电路中的作用。这将帮助我们理解所提到的练习。

weixin_65190179的博客 9173

有限差分法地震数据正演模拟(二)

正演模拟,是在地球物理勘探研究中,根据地质体的形状、产状和物性数据,通过构造数学模型计算得到其理论值(数学模拟),或通过构造实体模型来观测模型所产生的地球物理效应的数值(物理模拟)。p(t+1,x,z)即为下一时刻的波长信息,该波动方程的意义就是通过前一时刻(p(t-1,x,z))和现在时刻(p(t,x,z))预测下一时刻波的传播情况。声波波动方程:反应声波的传播规律,描述最简单的波现象的方程,p代表波场信息,v表示速度场信息因为速度只与速度场有关,所以只与x,z有关。其结果也可以作为反演的验证。

weixin_46285501的博客 3939

死锁的排查方法和排查工具有哪些?

死锁(Dead Lock)指的是两个或两个以上的运算单元(进程、线程或协程),都在等待对方释放资源,但没有一方提起释放资源,从而造成了一种阻塞的现象就称为死锁。比如线程 1 拥有了锁 A 的情况下试图获取锁 B,而线程 2 又在拥有了锁 B 的情况下试图获取锁 A,这样双方就进入相互阻塞等待的情况,如下图所示:死锁的代码实现如下: 以上程序的执行结果如下图所示:从上述结果可以看出,线程 1 和线程 2 都在等待对方释放锁,这样就造成了死锁问题。哪死锁应该如何排查呢?排查死锁总共有 4 种工具:接下来,我们一

猫头虎技术团队:授渔优于赠鱼,兴趣引领智慧,探索之乐尤显珍贵。商务合作+:Libin9iOak ,万粉变现+:优快云WF,猫头虎承诺每年免费为100名C站创作者做账号流量诊断服务!全网搜:猫头虎技术团队,点击文章底部名片或直接私信我一切皆可谈,快找虎哥! 7918

软件缺陷(定义+表现形式+优先级+信息+产生原因),看完这篇文章就懂了

软件缺陷软件缺陷的定义软件缺陷的表现形式软件缺陷产生的原因软件缺陷的根源软件缺陷的费用软件缺陷的信息 软件缺陷的定义 IEEE 1983 of IEEE Stardard 729中软件缺陷做了一个标准的定义: 从产品内部看,软件缺陷是软件产品开发或维护过程中所存在的错误、毛病等各种问题;从外部看,软件缺陷是系统所需要实现的某种功能的失效或违背。 因此软件缺陷就是软件产品中所存在的问题,最终表现为用户所需要的功能没有完全实现,没有满足用户的需求。 缺陷不是bug,缺陷包含bug,缺陷的范围更大。 软件缺陷

qq_40676418的博客 1万+

如何排查死锁?

死锁是因为两个或两个以上的运算单元,都在等待对方停止执行,以取得系统资源,但没有一方提前退出,于是就出现了死锁。死锁的排查工具总共有 4 种:jstackjconsolejvisualvmjmc从易用性和性能方面来考虑,推荐使用 jconsole 或 jvisualvm 来排查死锁。

程序员高级码农的博客 1249

innovus:addRepeaterByRule用法

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?addRepeaterByRule不管transition/timing violation,只根据约束的length/cap/fanout等等去给net 插buffer。

m0_61544122的博客 1092

“华为杯”研究生数学建模竞赛2017年-【华为杯】B题:面向下一代光通信的 VCSEL 激光器仿真模型

得出以下主要结论:在相同的偏置电流条件下,随着温度的升高,带宽的峰值向。在相同的温度下,随着电流的增大,带宽的峰值越小且曲线由波峰形状。方案,包括可能的数学公式,不同温度和偏置电流下的带宽响应曲线,并与问题。线,得出以下主要结论:在相同的偏置电流条件下,随着温度的升高,带宽的峰。在相同的温度下,随着电流的增大,带宽的峰值越小且曲线由波峰形状逐渐变得。得的激光器特性曲线和模型中仿真得到的特性曲线,之后,可以将两组曲线的差。说明的是,由于数值优化算法的成功与否很大程度上依赖于初始参数的猜测,参。

getusushu的博客 99

死锁是什么以及如何排查和避免

线程死锁是指 ‌两个或多个线程因相互等待对方释放资源而永久阻塞‌ 的状态。当多个线程同时持有资源并请求其他线程持有的资源时,若形成循环等待链,系统将无法继续推进执行。‌死锁的四大必要条件‌互斥‌:资源一次只能被一个线程占用(如锁)‌持有并等待‌:线程持有资源同时等待其他资源‌不可剥夺‌:资源只能由持有者主动释放‌循环等待‌:线程间形成环形等待链// 线程1 // 线程2// 操作1 // 操作2} }} }‌策略‌‌适用场景‌‌关键实现‌‌统一锁顺序‌多锁协作场景。

weixin_44984196的博客 1124

【网络与爬虫 62】小程序爬虫终极攻略:微信支付宝小程序数据采集完全指南

本文深入解析微信和支付宝小程序的爬虫技术,从基础架构分析到高级逆向工程,涵盖WXML/AXML模板解析、API接口拦截、网络流量分析等核心技术。通过实战案例和代码示例,帮助开发者掌握小程序数据采集的完整技术栈。

熵数实验室 3419

Java线程死锁问题怎么排查

监控与初步判断:通过监控工具观察线程状态和系统响应情况;采集线程 dump:使用 jstack 或其他工具生成线程转储;分析线程转储:利用死锁检测信息、调用栈和专用工具定位死锁原因;代码和设计审查:检查并发代码的锁使用和同步逻辑,确保锁的顺序一致;预防与监控:采用程序检测、定期采集线程 dump 和报警机制预防死锁的发生。通过系统化的排查流程,结合工具分析和代码优化,可以有效定位和解决 Java 线程死锁问题。

longgelaile的博客 1326

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Java中死锁问题怎么排查

【代码】Java中死锁问题怎么排查。

牛马baby的博客 965

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java死锁问题如何排查?

Java死锁问题如何排查?

java1234的博客 1180

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

MySQL死锁问题排查

比如:事务1在表1上加了S锁后,事务2想要更改某行记录,需要添加IX锁,由于不兼容,所以需要等待S锁释放;如果事务1在表1上加了IS锁,事务2添加的IX锁与IS锁兼容,就可以操作,这就实现了更细粒度的加锁。如果 T1 持有 r 的 x 锁,那么 T2 请求 r 的 x、s 锁都不能被立即允许,T2 必须等待T1释放 x 锁才可以,因为X锁与任何的锁都不兼容。InnoDB 实现了标准的行级锁,包括两种:共享锁(简称 s 锁)、排它锁(简称 x 锁)。事务持有什么锁,在等待什么锁。

carolineme的博客 1076

Java 死锁问题排查及优化方案

在 Java 开发中,死锁是一个常见但又棘手的问题。当程序出现死锁时,可能会导致程序挂起、用户请求无响应以及 CPU 使用率下降等情况。本文将介绍 Java 死锁问题的排查方法以及一些优化方案。

m0_57836225的博客 782

Java中死锁问题怎么排查?

通过工具可视化线程-锁依赖关系后,结合代码逻辑调整同步策略即可解决。预防胜于治疗,良好的并发设计能彻底避免死锁风险。你想要的技术资料我全都有:https://pan.q删掉汉子uark.cn/s/aa7f2473c65b。

牛马baby的博客 1177

MySQL 死锁问题排查与分析

死锁是指两个或多个事务在执行过程中,因争夺资源而造成的一种僵持状态,若无外力作用,这些事务将无法继续执行。

web18285482512的博客 902

JVM问题排查——死锁

文章目录环境准备工作排查姿势一:使用JVisualVM排查姿势二:使用Jps+Jstack 环境 JDK8   准备工作 先准备好一个死锁程序:(程序是网上随便找的) public class DeadLock { public static String obj1 = "obj1"; public static String obj2 = "obj2"; pu...

m0_46311226的博客 2173

MySQL死锁问题如何排查?

MySQL死锁问题如何排查?

java1234的博客 1161

Mysql死锁问题如何排查和解决

发生死锁了,如何排查和解决呢?本文将跟你一起探讨这个问题准备好数据环境模拟死锁案发分析死锁日志分析死锁结果在分析死锁日志前,先做一下锁介绍,哈哈~最后,遇到死锁问题,我们应该怎么分析呢?模拟死锁场景查看死锁日志找出死锁SQLSQL加锁分析,这个可以去官网看哈分析死锁日志(持有什么锁,等待什么锁)熟悉锁模式兼容矩阵,InnoDB存储引擎中锁的兼容性矩阵。

qq_43842093的博客 5509

MySQL死锁类deadlock问题排查

详解MySQL InnoDB死锁排查利器SHOW ENGINE INNODB STATUS与永久日志配置innodb_print_all_deadlocks,手把手教你快速捕获、解读死锁现场,定位事务SQL与锁等待循环,提供可落地的优化模板与紧急应对策略,助你彻底消灭死锁性能隐患。

每个人都是独一无二的,把握好自己的节奏,跟着自己的心走。 1384

如何排查Mysql死锁问题

排查mysql死锁问题

qq_42479531的博客 893

线上死锁问题排查和处理

通过 jps + jstack 来定位和排查。如果线程长时间处于阻塞,就需要考虑是否是死锁了。 SHOW ENGINE INNODB STATUS 查看死锁日志

trigger的博客 1276
上一篇: 搭建k8s集群
西游却冻醒
博客等级 码龄11年 47粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值