[MySQL]一次死锁排查

news/2024/9/20 1:40:36/文章来源:https://www.cnblogs.com/DCFV/p/18405413

字节面试题

image
在可重复隔离级别下,这种情况会发生什么?

答案:死锁

下面我们用一个具体的例子来展示:
首先我们有一张这样的表
image
下面我们来执行一些语句,

image

可以看到结果输出了,检测到发生了死锁

Deadlock found when trying to get lock; try restarting transaction

下面具体分析,首先给出执行流程

事务A 事务B
1 begin; begin;
2 update user set age = 30 where id = 25;
3 update user set age = 30 where id = 26;
4 insert into user(id,name,age,email) values(25,"dcf",30,"123@qq.com");
5 insert into user(id,name,age,email) values(26,"dcf",30,"123@qq.com");

下面分析每个阶段的加锁情况

  1. 阶段2 update user set age = 30 where id = 25;

通过select * from performance_schema.data_locks\G;来查看加锁的情况:

image

可以看到加了两种锁,一种是表锁,意向排他锁,可以看到成功获取了这把锁,

LOCK_TYPE: TABLE
LOCK_MODE: IX
LOCK_STATUS: GRANTED
LOCK_DATA: NULL

另一种是记录锁,排他锁,间隙锁,锁住的范围是(20,30),可以看到成功获取到了这把锁,

LOCK_TYPE: RECORD
LOCK_MODE: X,GAP
LOCK_STATUS: GRANTED
LOCK_DATA: 30
  1. 阶段3 update user set age = 30 where id = 26;

通过select * from performance_schema.data_locks\G;来查看加锁的情况:

image

可以看到加了两种锁,一种是表锁,意向排他锁,可以看到成功获取了这把锁,

LOCK_TYPE: TABLE
LOCK_MODE: IX
LOCK_STATUS: GRANTED
LOCK_DATA: NULL

另一种是记录锁,排他锁,间隙锁,锁住的范围是(20,30),可以看到成功获取到了这把锁,

LOCK_TYPE: RECORD
LOCK_MODE: X,GAP
LOCK_STATUS: GRANTED
LOCK_DATA: 30
  1. 阶段4 insert into user(id,name,age,email) values(25,"dcf",30,"123@qq.com");

image

  1. 阶段5 insert into user(id,name,age,email) values(26,"dcf",30,"123@qq.com");

image

可以看到第3,4阶段双方都在等待锁,产生了死锁现象,
这个死锁的产生是由于,在阶段1,2双方持有了(20,30)区间的间隙锁,阶段3,4的插入操作会产生插入意向锁,这两个插入意向锁都被对方的间隙锁所阻塞,从而产生了死锁。

插入意向锁介绍
本文使用了间隙锁会阻塞插入意向锁这个特点

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

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

相关文章

微信小程序开发系列6----页面配置--WXML模板快捷传参

源码获取方式(免费):(1)登录-注册:http://resources.kittytiger.cn/(2)签到获取积分(3)搜索:4-wxmltemplate-WXML模板快捷传参

微信小程序开发系列5----页面配置--WXML列表渲染-wxkey详解

下图本来选中Switch1 更新后选中的是Switch5了使用下图红色部分就能解决,id是data里定义的换name也可以,红色部分不能写item.Id 注:不给wx:key会给一个警告,给了性能会更高 源码获取方式(免费):(1)登录-注册:http://resources.kittytiger.cn/(2)签到获取积分(3)搜…

学习日历-2024/9/9

今天数据结构和马原第一次上课,感觉老师都还不错,作为学委,我也主动找老师加了联系方式 今天Java开学考试,14分,还行,在运行中报了一下错,我感觉是我输入的问题, Java关于List的一些知识和数据结构的知识 List List集合特有方法List集合的遍历方式数据结构 栈 数据进入栈模型的…

一文梳理RAG(检索增强生成)的现状与挑战

一 RAG简介 大模型相较于过去的语言模型具备更加强大的能力,但在实际应用中,例如在准确性、知识更新速度和答案透明度方面,仍存在不少问题,比如典型的幻觉现象。因此,检索增强生成 (Retrieval-Augmented Generation, RAG) 被当作于大模型应用开发的一种新范式。RAG是指在利…

我的博客搬家啦!!!

大家好! 感谢大家一直以来的支持和关注!经过深思熟虑,我决定将我的博客迁移至博客园的新账号。未来,我将在这个新的平台上持续分享技术文章、项目经验以及个人见解,而原有的博客将不再更新。 为什么选择搬家? 随着时间的推移,我发现自己对内容创作有了新的想法和方向,而…

Codeforces Round 942 (Div. 1) VP 记录

Codeforces Round 942 (Div. 1) VP 记录 我没实力打 Div1 /kk 事实上我唯一 rated 的那场 Div1 切三题是不是运气好啊 /kk /kk A 考虑 \(k = 0\) 的时候怎么做。设最小值为 \(x\),答案显然是 \(\sum [a_i = x \vee a_i = x + 1] a_i\)。 都与最小值相关了,都最小值最大了,直…

【工具使用】【OpenFeign 】OpenFeign 下未开启重试,服务却被调用了两次

1 前言 上节我们看了下 OpenFeign 里的重试,后来我从源码的角度看了下它的原理,发现一个诡异的情况,就是我没开启重试的情况下,我的服务却被调用了两次,这是为什么呢?本节我们来看看这个问题。 2 环境准备 首先准备一下,我这里有两个服务,一个是 demo 一个是 virtuou…

CSP模拟 取模

最近开始写 CSP 模拟的题,实际上考的题一点也不 CSP 题意 有一个长度为 \(n\) 的序列 \(A\),\(0\leq A_i<k\),你可以每次选取一个区间,将区间内所有元素 \(+1\),然后将区间内所有元素对 \(k\) 取模。问最少几次操作可以把序列中所有元素都变为 \(0\)。 思路 假设现在有…

爬虫案例2-爬取视频的三种方式之一:requests篇(1)

@目录前言爬虫步骤确定网址,发送请求获取响应数据对响应数据进行解析保存数据完整源码共勉博客 前言 本文写了一个爬取视频的案例,使用requests库爬取了好看视频的视频,并进行保存到本地。后续也会更新selenium篇和DrissionPage篇。当然,爬取图片肯定不止这三种方法,还有基…

支持向量机模型 0基础小白也能懂(附代码)

本篇我们要讲解的模型是大名鼎鼎的支持向量机 SVM,这是曾经在机器学习界有着近乎「垄断」地位的模型,影响力持续了好多年。直至今日,即使深度学习神经网络的影响力逐渐增强,但 SVM 在中小型数据集上依旧有着可以和神经网络抗衡的极好效果和模型鲁棒性。支持向量机模型 0基础…

LeetCode题集-3 - 无重复字符的最长子串

本文讨论了给定字符串找最长无重复字符子串的三种解法:双指针法、双指针+哈希法、双指针+数组法。其中,双指针+数组法因ASCII码特性效率最高,基准测试表明其优于哈希法。题目:给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。我们先来好好理解题目,示例1…

2-5Java多态

Java 多态 多态是同一个行为具有多个不同表现形式或形态的能力。 多态就是同一个接口,使用不同的实例而执行不同操作,如图所示:多态性是对象多种表现形式的体现。 现实中,比如我们按下 F1 键这个动作:如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档; 如果当前在 Wor…