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

article/2025/9/28 4:13:48

目录

一、MySQL出现死锁的场景

二、MySQL当中的死锁现象

三、Insert语句怎样加锁的

      隐式锁&显示锁

      记录之间加有间隙锁

      遇到唯一键冲突或者主键冲突的时候加锁

        如果主键索引重复: 

        ​​​​​​如果唯一二级索引重复:

四、如何避免MySQL当中的死锁现象 

    方案一、设置任务超时等待时间

     方案二、主动开启死锁检测

      方案三、对于更新频繁的字段,采用唯一索引的设置方案

本文为博主参考网站《小林coding》的学习笔记,具体内容请参考转载网站 

一、MySQL出现死锁的场景

 关于什么是死锁问题,已经在这一篇文章当中提到了。这是Java当中的死锁问题:Java对于synchronized的初步认识_革凡成圣211的博客-CSDN博客synchronized,死锁,https://blog.csdn.net/weixin_56738054/article/details/128062475?spm=1001.2014.3001.5501

死锁的准确定义:就是在一组线程当中,他们竞争同一资源而造成相互阻塞的现象。

那么,在mysql当中,也会出现死锁,这里的死锁又是什么呢? 


二、MySQL当中的死锁现象

 假设有下面这一张表:

id(主键索引)no(非主键索引)name
11001小明
21002小李
31003小华
41004小黄

在这一张表当中,id为主键索引,为二级索引,name这一列没有任何索引的约束。

现在这张表当中,有以上的一些数据。

现在,有两个事物,一个事物A,另外一个事物B

下面,根据步骤,分析一下下面两个事物的执行流程:

       第一步:

       在上述两个事物当中,事物A首先开启了,然后执行一条查询的sql语句:也就是select...for update这样的语句。 因为记录的最大值为1004,1007不在这一个范围当中。此时,事物A对于表当中no范围为(1004,+∞)的no索引加上了一把锁间隙锁


       第二步:

       事物B开启了,因为no值为1008的记录,不在范围(1004,+∞)的范围之内。因此,事物B也会加一个间隙锁,范围是(1004,+∞);由于间隙锁之间是互容的,因此事物B在执行select语句的时候,不会发生阻塞。


       第三步: 

       事物A执行了一条插入的索引为1007的数值。但是,由于事物B对于事物A插入的范围加上了间隙锁,因此事物A一定要等待到事物B释放锁,才可以继续执行


       第四步:

       事物B执行了一条插入的索引值为1008的sql语句。但是,由于事物A对于(1004,+∞)的范围加锁了。因此,事物B一定需要等待到事物A释放锁,才可以继续执行。

       可以看到,此时,两个事物互相阻塞了。


三、Insert语句怎样加锁的

        Insert语句在正常执行的时候,是不会生成锁结构的,它是靠聚簇索引自带的一个被称为trx_id的字段来作为隐式锁来保护记录的。


      隐式锁&显示锁

        在Insert的过程当中不加锁,只有在特殊的情况下面,才会把隐式锁转化为显示锁,也就是真正加锁的过程。

        举两个例子来说明隐式锁转换为显示锁的场景:

       ①范围(a,b)内加有间隙锁,当有一条记录在范围(a,b)之内插入记录的时候,就会转化为显示锁。

       ②如果insert语句插入的记录已有的记录之间出现了主键,也无法插入。

      记录之间加有间隙锁

         还是上面这个表:

id(主键索引)no(非主键索引)name
11001小明
21002小李
31003小华
41004小黄

         此时,这一张表当中,假如有一条语句,执行:

select * from t_order where order_no = 1006 for update;

       此时,事物如果插入一条语句,insert....values(1007...),这个时候,由于插入的数据正好在前一个sql语句插入的范围之内,因此会被阻塞。


      遇到唯一键冲突或者主键冲突的时候加锁

        如果主键索引重复: 

          当隔离级别为读已提交的时候,对这一条记录的主键索引S型记录锁;

          当隔离级别为可重复读的时候,插入新记录的事物会给已存在的


        ​​​​​​如果唯一二级索引重复:

          不论是哪个隔离级别,插入新记录的事务都会给已存在的二级索引列值重复的二级索引记录添加 S 型 next-key 锁


四、如何避免MySQL当中的死锁现象 

    方案一、设置任务超时等待时间

      当在一个任务的等待时间超过了这个时间之后,就进行回滚;

      在 InnoDB 中,参数 innodb_lock_wait_timeout 是用来设置超时时间的,默认值时 50 秒。


     方案二、主动开启死锁检测

        将参数 innodb_deadlock_detect 设置为 on。

        当innodb检测发现死锁之后,就会进行回滚死锁的事物。


      方案三、对于更新频繁的字段,采用唯一索引的设置方案

         例如在上面的例子当中,可以把no字段设置成唯一索引。    


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

相关文章

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:关节回归矩阵的先验,保存形…

SMPL 人体模型简要

smpl是指2015 马普的一篇文章“SMPL: a skinned multi-person linear model”中构建的人体参数化三维模型,人体可以理解为是一个基础模型和在该模型基础上进行形变的总和,在形变基础上进行PCA,得到刻画形状的低维参数——形状参数&#xff08…

SMPL-论文解读

文章目录 创新点算法shape blend shape:pose blend shapeJoint locationSMPL model 训练过程Pose Parameter Trainingjoint regressorShape Parameter TrainingOptimization summary DMPL实验结论 论文: 《SMPL: A skinned multi-person linear model》…

SMPL模型进阶

SMPL模型是一种参数化人体模型,是马普所提出的一种人体建模方法,该方法可以进行任意的人体建模和动画驱动。这种方法与传统的LBS的最大的不同在于其提出的人体姿态影像体表形貌的方法,这种方法可以模拟人的肌肉在肢体运动过程中的凸起和凹陷。…

SMPL源代码实现和模型解读

对于SLAM的工作已经告一段落了,传统的人体动态三维重建也要告一段落了,由于课题研究的方向是基于图像\视频的人体三维重建,三维shape、pose的恢复:所以今天和大家交流的是SMPL模型,对于SMPL模型的理论部分欢迎大家交流…