mysql死锁 gap next key 加锁分析

news/2024/7/7 22:20:37

这个案例的原文参见: mysql死锁场景汇总整理_死锁业务场景_秃了也弱了。的博客-CSDN博客

那么我们就来分析下整个加锁过程吧。

关键词: next-key & gap 锁 & 插入意向锁 & 二级普通索引

前提:RR级别

CREATE TABLE `t_user` (

  `id` bigint(20) NOT NULL AUTO_INCREMENT,

  `age` int(3) DEFAULT NULL,

  PRIMARY KEY (`id`),

  KEY `udx_age` (`age`) USING BTREE

) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;

insert into t_user(`age`) values (25);

insert into t_user(`age`) values (27);

insert into t_user(`age`) values (29);

insert into t_user(`age`) values (31);

执行流程和加锁分析见如下。

1)其中LOCK_ORDINARY 就是next key (也就是 rec + gap), 死锁日志中一般打印为 LOCK_MODE X,不打 lock ordinary 因为lock_ordinary 的mode值是0。

2) heap no +space id+ page id唯一定位一个索引的一个行记录。

每个page的 heap no = 0, 代表infimum,人为规定的最小值,1 代表supremum 人为规定的最大值。从2开始才是真正的记录。

session1

session2

备注

start transaction;

start transaction;

delete from t_user where age =27;

读二级索引上的匹配行

lock_sec_rec_read_check_and_lock

uxd_age上, X, LOCK_ORDINARY, heap-no=2

pk上: x, rec_not_gap ,heap=2

lock_sec_rec_modify_check_and_lock

加锁

x,rec, udx_age,  heap=2, X, REC_NOT_GAP,已加过,返回成功。

读二级索引上下一个行

lock_sec_rec_read_check_and_lock

又在uxd_age上加了gap锁,heap no =4 ,LOCK_GAP

do nothing

delete from t_user

 where age = 31;

读二级索引上的匹配行

lock_sec_rec_read_check_and_lock

heap no =5 ,uxd_age lock_x, lock ordiniary;

heap_no = 5 , pk ,x, rec.

lock_sec_rec_modify_check_and_lock

uxd_age, heap = 5, x,rec, 已加过,返回成功

读二级索引下一个匹配行

uxd_age ,heap=1(supremum), x, lock ordinary.

insert into t_user(`age`) values (30);

do nothing

session1执行结果阻塞

lock_rec_insert_check_and_lock add_to_waitq

insert 待申请的锁: LOCK_X | LOCK_GAP | LOCK_INSERT_INTENTION,

heap no = 5, index= udx_age, type mode 35(loc x lock_ordinary)

do nothing

insert into t_user(`age`) values (28);

session2执行结果报deadlock

lock_rec_insert_check_and_lock add_to_waitq

insert 待申请的锁: LOCK_X | LOCK_GAP | LOCK_INSERT_INTENTION,

heap no = 4, index= udx_age.

等待的锁:

type mode = 547, index udx_age, heap no = 4.

T2 ROLLBACK.

计算出死锁


http://lihuaxi.xjx100.cn/news/978124.html

相关文章

【蓝桥杯集训·每日一题】AcWing 3555. 二叉树

文章目录一、题目1、原题链接2、题目描述二、解题报告1、思路分析2、时间复杂度3、代码详解三、知识风暴最近公共祖先一、题目 1、原题链接 3555. 二叉树 2、题目描述 给定一个 n 个结点(编号 1∼n)构成的二叉树,其根结点为 1 号点。 进行 m…

基于ChatRWKV智能问答和内容创作

ChatRWKV是对标ChatGPT的开源项目,希望做大规模语言模型的Stable Diffusion,测试很一段时间确实很像ChatGPT,从使用方法和内容结果上都很相似,但是还有一些差异。 文章目录 准备工作环境配置创建虚拟环境激活虚拟环境pip安装匹配版本ChatRWKV 使用模型替换常用参数设置使用…

【springmvc】执行流程

SpringMVC执行流程 原理图 1、SpringMVC常用组件 DispatcherServlet:前端控制器,不需要工程师开发,由框架提供 作用:统一处理请求和响应,整个流程控制的中心,由它调用其它组件处理用户的请求 HandlerMa…

< JavaScript小技巧:Array构造函数妙用 >

文章目录👉 Array构造函数 - 基本概念👉 Array函数技巧用法1. Array.of()2. Array.from()3. Array.reduce()4. (Array | String).includes()5. Array.at()6. Array.flat()7. Array.findIndex()📃 参考文献往期内容 💨今天这篇文章…

项目实战典型案例23——-注册上nacos上的部分服务总是出现频繁掉线的情况

注册上nacos上的部分服务总是出现频繁掉线的情况一:背景介绍二:思路&方案解决问题过程涉及到的知识nacos服务注册和服务发现一:背景介绍 spring cloud项目通过nacos作为服务中心和配置中心,出现的问题是其中几个服务总是出现…

基于Three.js和MindAR实现的网页端WebAR人脸识别追踪功能的京剧换脸Demo(含源码)

前言 近段时间一直在玩MindAR的功能,之前一直在弄图片识别追踪的功能,发现其强大的功能还有脸部识别和追踪的功能,就基于其面部网格的例子修改了一个国粹京剧的换脸程序。如果你不了解MindAR的环境配置可以先参考这篇文章:基于Mi…

[nodejs开发] typescript引入js模块或文件

首先更改tsconfig.json 中的compilerOptions属性:"moduleResolution": "Node"假设有一个abc.js其内容如下:var Circle (function () {function Circle() {}Circle.prototype.draw function () {console.log("Cirlce is drawn…

JavaScript 高级实例集合

文章目录JavaScript 高级实例集合创建一个欢迎 cookie简单的计时另一个简单的计时在一个无穷循环中的计时事件带有停止按钮的无穷循环中的计时事件使用计时事件制作的钟表创建对象的实例创建用于对象的模板JavaScript 高级实例集合 创建一个欢迎 cookie 源码 <!DOCTYPE ht…