MySQL死锁分析

article/2025/9/28 3:15:39

背景知识

MySQL数据库InnoDB引擎的行级锁在使用时是在索引记录上加锁的。

行级锁从占有模式上分为:

  • 排他锁:独占行数据,如某事务获取了该行记录的排他锁,其他事务在获取该记录的排他锁和共享锁时需等待;
  • 共享锁:共享行数据,如某事务获取了该行记录的共享锁,其他事务可获取该记录的共享锁,如想获取独占锁则需等待。

从锁定的数据范围来看,有:

  • 记录锁(Record Locks):锁在索引记录上的锁,可以是共享锁或排他锁。
  • 间隙锁(Gap Locks):两条记录之间的间隙,或者第一条记录前的间隙,或者最后一条数据之后的间隙。注意:在RR事务隔离级别时,如果加锁的索引是唯一索引的话,不需要加间隙锁。
  • Next-Key Locks:记录锁和间隙锁的集合。如果加锁的索引是唯一索引的话,不需要加间隙锁,也就退化成了记录锁。

以上是一些背景知识,以下实践使用的是MySQL 5.7版本。

初始化数据

接下来描述死锁的一种场景,我们创建表并初始化一部分数据:

-- 创建表
CREATE TABLE `deadlock_test` (
`id` int(11) NOT NULL primary key auto_increment,
`a` int(11) NOT NULL ,
INDEX (`a`)
) ENGINE=InnoDB;-- 初始化数据
insert into deadlock_test (id, a) values (1,2),(3,4),(8,5),(13,11);

此时表中的数据以id、a的顺序展示如下,注意id是主键:

以a、id的列顺序展示如下,注意a加了非唯一索引:

此时,在a索引记录上可以加的行记录锁,以(a,id)的格式列出来会有如下几个,以(a,id)的格式列是因为a索引的组织和存储形式是这样的顺序,a是索引值,id是二级索引指向的主键索引值,这种格式列出来也容易看出间隙锁可能的情况:

(2,1)
(4,3)
(5,8)
(11,13)

间隙锁的间隙分别会有如下几个范围,也以(a,id)的格式列出来:

最小值和(2,1)之间的间隙;
(2,1)和(4,3)之间的间隙;
(4,3)和(5,8)之间的间隙;
(5,8)和(11,13)之间的间隙;

(11,13)和最大值之间的间隙;

触发死锁

接着执行如下两个事务的SQL,在执行到T5时间时发生死锁:

 

死锁日志和死锁产生过程分析

发生死锁后,执行截取死锁日志

show engine InnoDB status;

死锁日志如下

------------------------
LATEST DETECTED DEADLOCK
------------------------
2022-03-06 21:46:35 0x1ce4
*** (1) TRANSACTION:
TRANSACTION 6026442, ACTIVE 13 sec inserting
mysql tables in use 1, locked 1
LOCK WAIT 3 lock struct(s), heap size 1136, 2 row lock(s), undo log entries 1
MySQL thread id 9, OS thread handle 13044, query id 32078 localhost ::1 root update
insert into deadlock_test (a, id) values (5,7)
*** (1) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 66 page no 4 n bits 72 index a of table `my_test_db`.`deadlock_test` trx id 6026442 lock_mode X locks gap before rec insert intention waiting
Record lock, heap no 4 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 4; hex 80000005; asc     ;;
 1: len 4; hex 80000008; asc     ;;

*** (2) TRANSACTION:
TRANSACTION 6026441, ACTIVE 34 sec inserting, thread declared inside InnoDB 5000
mysql tables in use 1, locked 1
5 lock struct(s), heap size 1136, 4 row lock(s)
MySQL thread id 3, OS thread handle 7396, query id 32089 localhost ::1 root update
insert into deadlock_test (a, id) values (5,7)
*** (2) HOLDS THE LOCK(S):
RECORD LOCKS space id 66 page no 4 n bits 72 index a of table `my_test_db`.`deadlock_test` trx id 6026441 lock_mode X
Record lock, heap no 4 PHYSICAL RECORD: n_fields 2; compact format; info bits 0
 0: len 4; hex 80000005; asc     ;;
 1: len 4; hex 80000008; asc     ;;

*** (2) WAITING FOR THIS LOCK TO BE GRANTED:
RECORD LOCKS space id 66 page no 3 n bits 72 index PRIMARY of table `my_test_db`.`deadlock_test` trx id 6026441 lock mode S locks rec but not gap waiting
Record lock, heap no 6 PHYSICAL RECORD: n_fields 4; compact format; info bits 0
 0: len 4; hex 80000007; asc     ;;
 1: len 6; hex 0000005bf4ca; asc    [  ;;
 2: len 7; hex bb000001310110; asc     1  ;;
 3: len 4; hex 80000005; asc     ;;

*** WE ROLL BACK TRANSACTION (1)

我们结合加锁的过程和死锁日志,分析死锁的过程,下面列出的间隙锁和索引记录锁都是以(a,id)的列顺序格式表示:

事务一在执行T2时间的语句之后,持有了表级的IX锁,行级的Next-Key Locks和间隙锁。Next-Key Lock是行锁和间隙锁的组合,以(a,id)的格式展示,这里包括(5,8)的行记录锁以及(4,3)、(5,8)之间的间隙锁;间隙锁是(5,8)、(11,13)之间的间隙锁。

事务二在执行T4时间的语句时,需要获取表级的IX锁,行级的间隙锁。在获取IX锁时不会有问题,因为两个事务间的IX是可以兼容的;接着获取行记录(5,8)的间隙锁,这里包括(4,3)、(5,8)之间的间隙锁,因为这些锁已经被事务一持有,因此需要等待。另外,事务二在执行插入时,还要获取主键7的行记录共享锁和排它锁。

接下来事务一执行T5时间的语句,在执行该语句时,需要获取主键7的行记录共享锁和排他锁。

综上所属,截至到T5时间,事务一持有(4,3)、(5,8)之间的间隙锁和(5,8)、(11,13)之间的间隙锁,以及(5,8)的记录锁,等待主键7的行记录共享锁和排他锁;事务二等待主键7的共享锁和排他锁,等待(4,3)、(5,8)之间的间隙锁;相互等待,发生死锁。

接着,MySQL服务器检测出死锁,回滚了事务二,在死锁日志中对应的是TRANSACTION 6026442。

参考资料

mysql锁(九)innodb下的记录锁,间隙锁,next-key锁 - 简书
MySQL :: MySQL 5.7 Reference Manual :: 14.7.1 InnoDB Locking


http://chatgpt.dhexx.cn/article/roGSOWsG.shtml

相关文章

故障分析 | MySQL死锁案例分析

作者:杨奇龙 网名“北在南方”,资深 DBA,主要负责数据库架构设计和运维平台开发工作,擅长数据库性能调优、故障诊断。 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转…

MySQL死锁

参考博客: https://blog.csdn.net/sinat_41653656/article/details/109629094 Mysql 锁类型和加锁分析 MySQL有三种锁的级别:页级、表级、行级。 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大&#xff…

mysql死锁语句_Mysql死锁

笔者最近在生产环境错误日志上看到updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction 这样的日志 ,网上看了很多文章 发现这篇文章 跟自己的场景非常接近…

【MySQL锁篇】MySQL死锁问题以及解决方案

目录 一、MySQL出现死锁的场景 二、MySQL当中的死锁现象 三、Insert语句怎样加锁的 隐式锁&显示锁 记录之间加有间隙锁 遇到唯一键冲突或者主键冲突的时候加锁 如果主键索引重复: ​​​​​​如果唯一二级索引重复: 四、如何避免MySQL当中的死锁现象 方案…

mysql死锁介绍以及解决

什么是死锁 死锁是2个线程在执行过程中, 因争夺资源而造成的相互等待的现象,若无外力作用,它们将无法推进下去。 死锁产生的4个必要条件 互斥条件 指进程对所分配的资源进行排他性使用,即一段时间内某资源只有一个进程占用&#…

MySQL - 死锁的产生及解决方案

MySQL - 死锁的产生及解决方案 1. 死锁与产生死锁的四个必要条件1.1 什么是死锁1.2 死锁产生的4个必要条件 2. 死锁案例2.1 表锁死锁2.2 行锁死锁2.3 共享锁转换为排他锁 3. 死锁排查4. 实例分析4.1 案例描述4.2 案例死锁问题复现4.3 死锁排查4.4 解决死锁 5. 如何避免死锁 1. …

MySql 死锁

MySql 死锁 一、什么是死锁InnoDB存储引擎定义了四种类型的行锁隔离等级对加锁的影响当前数据对加锁的影响 二、为什么会形成死锁两阶段锁协议产生死锁的四个必要条件 三、MySQL 如何处理死锁?杀死进程MySQL表间隙锁排他锁共享锁分析行锁定行锁优化 四、如何避免发生…

论文阅读|SMPL2015

摘要: 我们提出了一个学习过的人体形状和姿势相关的形状变化模型,该模型比以前更准确建模并与现有的图形管线兼容。我们的蒙皮多人线性模型(SMPL)是基于蒙皮顶点的模型,可以准确地表示各种各样的人体姿态。模型的参数是…

densepose与SMPL之IUV坐标转XYZ坐标

具体流程 一、SMPL模型 SMPL模型拥有6890个XYZ坐标的3D人体点,目前第一步需要将这6890个人体点进行分析,并将不同部位的点位进行归并,具体分为以下几个部分:头部,胸部,腰部,左臂,右…

人体捕捉:《SMPL》

《SMPL: A Skinned Multi-Person Linear Model》 作者:Matthew Loper 主页:https://smpl.is.tue.mpg.de/ 时间:2015 文章目录 Table of NotationModel generation functionsModel input parameters(controls)Model parameters(parameters le…

python3跑通smpl模型_Python smpl-pytorch包_程序模块 - PyPI - Python中文网

Pythorch的SMPL层 SMPL人体[1]层为PyTorch(用v0.4和v1.x测试) 是一个可微的pytorch层,它确定地从姿势和形状参数映射到人体关节和顶点。 它可以作为可微层集成到任何体系结构中,以预测实体网格。 代码由Yana Hasson改编自manopth存储库。 安装 您可以从PyPI:安装smpl pytorc…

SMPL STAR人体模型系列

SCAPE: 人体模型 SMPL: 人体模型 SMPL-H: 人体手 SMPL-X: 人体手人脸(FLAME) STAR: SMPL的改进版 人体模型主要思想是将pose, shape解耦,用参数化的方式描述人体表面的信息。 SCAPE:基于三角面片deformable的人体模型。 SMPL…

SMPL模型及源码解读

Contents Preface一、模型解读二、源码解读Citation Preface SMPL主要是人体三维重建常用模型,本文主要对模型及源码进行了解读(自己的理解不一定正确),为以后更好的利用此模型进行人体重建打好基础! 一、模型解读 二…

SMPL:数据增强之处理pose和3d点

SMPL 是一个低维度的参数化人体模型,SMPL系数有pose和shape,在训练基于SMPL的3Dmesh重建任务时候,一般需要进行数据增强 例如旋转,镜像等,那当GT 中有pose和3d点的时候,怎么处理? 一 &#xff1…

SMPL源码实现及相关问题

SMPL源码实现及相关问题 SMPL模型代码结构SMPL实现具体步骤一、环境的配置二、相关库的安装三、运行SMPL CITATION SMPL模型 SMPL模型官网http://smpl.is.tue.mpg.de/,里面可以下载模型和观看演示视频,只不过要先注册一个账号。SMPL由Michael J. Black团…

smpl-x论文学习-部分翻译

论文地址:Expressive Body Capture: 3D Hands, Face, and Body from a Single Image 知乎大佬的讲解:https://zhuanlan.zhihu.com/p/137235901 另一位大佬的讲解:https://posts.careerengine.us/p/5f23a5898988c12b4302afb6 1. 定性结果 和 …

人体动作捕捉与SMPL模型 (mocap and SMPL model)

人体动作捕捉与SMPL模型 (mocap and SMPL model) FesianXu 2020.7.5 前言 笔者最近在做和motion capture动作捕捉相关的项目,学习了一些关于人体3D mesh模型的知识,其中以SMPL模型最为常见,笔者特在此进行笔记,希望对大家有帮助&a…

blender 绘制离散顶点, SMPL骨架绘制

给定一些点,如何绘制出来,借助 blender 看下效果。纠结于 unity 还是 blender, 最终还是 blender 了。 目前还都不太满意,思路一比较靠谱,但是需要更复杂的计算 思路一,第二版,已完成&#xff…

SMPL-CN

paper-reading 为方便理解smpl文章的主要实现思想,此文为论文中文解读,资料来源zju。 日后有空,会写出论文的主要推导过程以及值得注意的重点。 摘要: 我们提出了一个人体形状和姿势相关的形状变化的学习模型,它比以前…

SMPL源码解读

这是源码的整体结构,先简单说一下各个文件里面是什么。 一、models文件 包含3个模型的.pkl文件,.pkl文件是python提供的可以以字符串的形式记录对象、变量的文件格式。这个模型里面包括了: 1.J_regressor_prior:关节回归矩阵的先验,保存形…