深入MySQL死锁场景

article/2025/9/28 2:47:42

总结死锁需满足以下条件:

  • 2个或者2个以上的并发事务操作
  • 并发事务之间存在锁冲突
  • 锁冲突关系成环形

GAP锁和Insert的隐式锁,最容易导致死锁,以下分析从这俩典型场景开始。

1. 表结构

建立以下表作为场景验证,id为主键,使用InnoDB,版本是5.7+,隔离级别RR。

CREATE TABLE `trigger` (`id` char(50) NOT NULL,`name` varchar(128) DEFAULT NULL,`cron` varchar(50) DEFAULT '0',`timeout` int(10) DEFAULT '0',`status` int(1) DEFAULT '0',`job_id` char(50) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `index_id` (`id`) USING BTREE,KEY `idx_name` (`name`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8

2. 死锁场景一

原因分析:行记录不存在时,加记录X锁变成加GAP X锁,GAP X锁可共存,插入意向锁与GAP X冲突导致死锁。

t1时刻:select for update where id=3加锁过程:默认加NextKey锁,但id=3不存在,退化为GAP锁

t2时刻:T2事务同样获取到GAP锁,因为GAP锁是共存锁

t3时刻:INSERT加锁过程:因为其他事务有GAP锁,需要加插入意向锁,等待T2释放

t4时刻:因为其他事务有GAP锁,需要加插入意向锁,等待T1释放,死锁

t3时的锁信息如下(select * from information_schema.innodb_locks):

GAP X锁,锁的范围是(下一个存在的索引值,上一个存在的索引值) 注意是开区间,id=3在这个范围内,所以当加插入意向锁时会冲突。

锁等待信息如下:

 tips:因为做了多次复现操作,事务ID不一定完全一致,能说明问题即可。

show engine innodb status 查看死锁信息。

T1事务在等待插入意向锁,T2拥有一个GAP X锁,同样在等待插入意向锁,检测到死锁,选择了T2进行回滚。

3.死锁场景二

原因分析:插入数据唯一索引冲突时,先获取GAP S锁,GAP S锁可共存,但与记录X锁冲突,插入意向锁与GAP S锁也会冲突,最终导致死锁。

t1时刻:T1 INSERT实际上未加锁,因为无任何冲突

t2时刻:T2出现INSERT唯一索引冲突,会给T1增加一个记录X锁,自身获取GAP S锁时,等待

t3时刻:T3同上获取GAP S锁时阻塞

t4时刻:T1操作回滚,释放记录X锁,T2和T3得到GAP S锁,接着获取插入意向锁,但与其他事务GAP S锁冲突,死锁。

t3时的锁信息如下(select * from information_schema.innodb_locks):

锁等待信息如下 

 死锁信息如下

只看到T2和T3,因为T1已经回滚结束。T2和T3都在等待获取插入意向锁,死锁状态。

补充一点innodb status的信息说明:

死锁信息显示

  • 记录锁(LOCK_REC_NOT_GAP): lock_mode X locks rec but not gap
  • 间隙锁(LOCK_GAP): lock_mode X locks gap before rec
  • Next-key 锁(LOCK_ORNIDARY): lock_mode X
  • 插入意向锁(LOCK_INSERT_INTENTION): lock_mode X locks gap before rec insert intention

💡 有一个例外:如果在 supremum record 上加锁,locks gap before rec会省略掉,间隙锁会显示成 lock_mode X,插入意向锁会显示成 lock_mode X insert intention

💡 infimum和supremum是系统生成的纪录,分别为最小和最大纪录值,infimum的下一条是用户纪录中键值最小的纪录,supremum的上一条是用户纪录中键值最大的纪录,通过next_record字段来相连

参考:

MySQL 中的 INSERT 是怎么加锁的?

MySQL :: MySQL 8.0 Reference Manual :: 15.7.1 InnoDB Locking

MySQL :: MySQL 8.0 Reference Manual :: 15.7.3 Locks Set by Different SQL Statements in InnoDB


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

相关文章

mysql死锁查询语句

mysql 死锁:如何解决mysql死锁 可直接在mysql命令行执行:showengineinnodbstatus\G;查看造成死锁的sql语句,分析索引情况,然后优化sql然后showprocesslist;另外可以打开慢查询日志,linux下打开需在my.cnf的[mysqld]里面加上以下内…

MySQL死锁排查步骤

系列文章目录 第一章:sql_mode模式 第二章:optimize table、analyze table、alter table、gh-ost 第三章:InnoDB MVCC原理 第四章:sql语句执行过程 第五章:Percona Toolkit工具简介 第六章:MySQL索引 第七…

MySql死锁过程

死锁一般怎么导致呢, 抛开一堆概念, 我就把死锁当成死结。 就是你代码获取锁的顺序问题。 MySql的死锁和我们正常代码也一样, 都是互通的, 当你修改一个表的行数据的时候, 就需要对那一行数据进行加锁。 所以很容易想…

中秋遇到mysql死锁怎么办

文章目录 前言一、什么是死锁二、死锁的产生条件三、死锁示例四、死锁的分析和查看1.查看最近1个死锁信息2.查看正在运行中的事务信息3.查看加锁信息 五、死锁的内部处理方案1.死锁探测机制2.锁等待超时机制 六、手动释放锁1.表级锁手动释放2.行级锁手动释放 七、死锁的优化策略…

mysql 死锁分析

一、 什么是死锁 死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等的进程称为死锁进程.二、 死锁产生的四个必要条件 1.互斥条件:指进…

MySQL死锁分析

背景知识 MySQL数据库InnoDB引擎的行级锁在使用时是在索引记录上加锁的。 行级锁从占有模式上分为: 排他锁:独占行数据,如某事务获取了该行记录的排他锁,其他事务在获取该记录的排他锁和共享锁时需等待;共享锁&…

故障分析 | 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…