MySQL8 间隙锁在11种情况下的锁持有情况分析

news2025/1/12 7:02:49

测试环境及相关必要知识

测试环境为mysql 8 版本

间隙锁(Gap Lock):用于锁定索引范围之间的间隙,防止其他事务在此间隙中插入新记录。间隙锁主要用于防止幻读问题。

在可重复读的隔离级别下默认打开该锁机制,解决幻读问题,也可手动修改配置文件关闭该锁机制,该锁机制为innodb自动决定间隙范围上锁,无需SQL显式声明锁。

表结构如下
在这里插入图片描述
数据如下
在这里插入图片描述
Mysql 运行中事务可以在表 information_schema.INNODB_TRX 中查看
在这里插入图片描述

Mysql 运行中事务持有的锁可以在表 performance_schema.data_locks 中查看
(一行分割两张图了)
在这里插入图片描述
在这里插入图片描述

Mysql 运行中事务等待持有锁的事务可以在表 performance_schema.data_lock_waits 中查看
在这里插入图片描述

LOCK MODE(锁模式)将出现的锁模式值和解释

S:共享锁(Shared Lock),允许其他事务获取相同对象的共享锁,但不允许排它锁。
X:排它锁(Exclusive Lock),在事务持有排它锁期间,其他事务无法获取相同对象的共享锁或排它锁。
IS:意向共享锁(Intention Shared Lock),表示事务准备获取一个表中某些行的共享锁。
IX:意向排它锁(Intention Exclusive Lock),表示事务准备获取一个表中某些行的排它锁。
SIX:共享意向排它锁(Shared Intention Exclusive Lock),表示事务准备获取一个表中某些行的共享锁,但也准备获取这些行的排它锁。
REC_NOT_GAP是MySQL InnoDB存储引擎中的一个特殊锁模式,用于锁定记录(行)而非间隙(gap)

注意:接下来将看到很多意向锁,意向排他锁并不等于持有了排它锁,只是表明有持有该锁的意向!
LOCK TYPE(锁类型)可能出现的是RECORD (行锁)、TABLE(表锁)

下面的各种情况下MySQL InnoDB锁持有情况的结构是先展示SQL,后展示持有锁的截图
持有锁截图中重要的字段为INDEX_NAME 索引名 LOCK_TYPE 锁类型 LOCK_MODE 锁模式 LOCK_STATUS 锁状态 LOCK_DATA 锁数据

走唯一索引的主键id+指定值+有值情况

begin ;
select * from t_gap_demo where id  = 3 for update ;

结果:对id=3的行记录上了行排他锁,当前表的意向排他锁
在这里插入图片描述

走唯一索引的主键id+指定值+无值情况

begin ;
select * from t_gap_demo where id  = 4 for update ;

插入id=4数据被阻塞,证明(3,]间隙已被锁定,插入id=8数据成功,插入id=2数据成功
结果:对数据7持有了排他锁、间隙锁范围为(3,7] 左开右闭原则
在这里插入图片描述

走唯一索引的主键id+指定范围+有值情况

begin ;
select * from t_gap_demo where id  between 3 and 8 for update ;

结果:持有了主键索引上的1、3、7、15四行的行锁且无间隙锁,持有表排它锁意向锁,额外还持有了普通索引age上的所有值的排它锁及间隙锁(0到正无穷都锁住了,这个字段没有负数)
这个结果挺让人震惊的,这句SQL居然持有了这么多锁,而且我测试插入id=2,age=1的记录是无法插入的,一直被阻塞。证明age整个范围的间隙锁都是被锁住了的,无法插入任何数据。
在这里插入图片描述
额外我还测试了一下该情况下update语句的锁情况

begin ;
update   t_gap_demo set age = 1 where id  between 3 and 8  ;

结果是锁住了(3,7] (7,15]间隙锁,3、7、15行锁,附带基本的表排他锁意向锁,至于为啥select语句时锁住了整个age间隙,还需要后续研究,有懂的大佬评论一下
在这里插入图片描述

走唯一索引的主键id+指定范围+无值情况

begin ;
select * from t_gap_demo where id  between 18 and 28 for update ;

id = 14可以插入,id = 16无法插入,阻塞
结果:持有了排它锁,锁住最后一行记录15到正无穷
在这里插入图片描述

begin ;
select * from t_gap_demo where id  between 10 and 12 for update ;

于是我又好奇假设这个区间无值,但是属于某个间隙呢
结果:持有了这个范围所在间隙的间隙锁 (7,15],15这个行记录的排它锁,表意向排它锁
在这里插入图片描述

走普通索引的age+指定值+有值情况

begin ;
select * from t_gap_demo where age  = 3 for update ;

结果:主键id=1的记录行锁排它锁锁定、普通索引上3,1 6,3全部锁定行记录加间隙,表意向排它锁
在这里插入图片描述

走普通索引的age+指定值+无值情况

begin ;
select * from t_gap_demo where age  = 4 for update ;

结果:持有了这个不存在的id处于的这个间隙的间隙锁和两个行记录的排它锁,表意向排它锁
在这里插入图片描述

走普通索引的age+指定范围+有值情况

begin ;
select * from t_gap_demo where age  between 20 and 40 for update ;

结果:持有了整个范围涉及的间隙的间隙锁、涉及行的排他锁,涉及行记录的主键记录的排它锁(不带间隙锁),表意向排它锁
在这里插入图片描述

走普通索引的age+指定范围+无值情况

begin ;
select * from t_gap_demo where age  between 78 and 88 for update ;

结果:持有age记录最大值到正无穷的间隙锁,表意向排它锁
在这里插入图片描述

拓展:非索引字段范围锁定

begin ;
select * from t_gap_demo where age  between 1 and 15 for update ;

结果:持有了整个id范围内所有行记录的排它锁和所在区间(包括左右无穷)的间隙锁,尝试插入id=2,id=16记录都是阻塞状态
在这里插入图片描述

总结

经过各种情况下事务对数据的加排它锁测试发现,mysql 8 innodb引擎会对涉及的数据和间隙都加上排他、间隙锁,甚至在普通索引时还会对涉及数据的主键索引也加上不带间隙锁的排它锁(X,REC_NOT_GAP),在非索引字段范围锁定时会对整个数据和间隙锁定,这告诉我们在使用时要注意,追求性能时少使用悲观锁,尽量避免锁竞争、避免死锁,尽量走主键索引或索引、尽量少锁定资源或只锁定最小范围数据、尽量精确操作某行数据,尽量让事务执行时间短,尽量避免同时事务并发操作同间隙内数据以避免死锁。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Hadoop设置hdfs全局指令

在终端进入用户个人环境变量配置文件 vim ~/.bashrc 然后添加如下内容 export PATH$PATH:/usr/local/hadoop/bin 添加到你的hadoop下载目录的bin目录为止就可以了 重新激活一下配置文件 source ~/.bashrc hdfs有专属于自己的文件存储目录,加上特殊的指令就可以箱终端一…

windows redis 自启动 Redis服务无法启动报错1067问题

如果你的系统服务里面已经有redis服务并且无法启动,则使用下面的命令卸载此服务 ! 1、停止Redis服务: redis-server --service-uninstall 2、删除系统服务 sc delete redis 进入到你的Redis安装目录,我的在以下目录,谨记此时不…

Pikachu靶场——XSS漏洞(Cross-Site Scripting)

文章目录 1. XSS(Cross-Site Scripting)1.1 反射型XSS(get)1.2 反射型XSS(post)1.3 存储型XSS1.4 DOM型XSS1.5 DOM型XSS-X1.6 XSS盲打1.7 XSS之过滤1.8 XSS之htmlspecialcharss1.9 XSS之href输出1.10 XSS之JS输出1.11 XSS 漏洞防御 1. XSS(Cr…

计算机毕设 招聘网站爬取与大数据分析可视化 - python 分析 可视化 flask

文章目录 0 前言1 课题背景2 实现效果3 Flask框架4 Echarts5 爬虫6 最后 0 前言 🔥 这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自…

SpringTask ----定时任务框架 ----苍穹外卖day10

目录 SpringTask 需求分析 快速入门 使用步骤 ​编辑业务开发 SpringTask 定时任务场景特化的框架 需求分析 快速入门 使用cron表达式来使用该框架 使用步骤 添加注解 自定义定时任务类 重点在于以下cron表达式的书写,精确表达触发的间隔 业务开发 主task方法 time使用(-…

No168.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

JUC第十七讲:JUC集合: ConcurrentLinkedQueue详解

JUC第十七讲:JUC集合: ConcurrentLinkedQueue详解 本文是JUC第十七讲:JUC集合 - ConcurrentLinkedQueue详解。ConcurerntLinkedQueue一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部是在队列中时间最长的…

【Java】微服务——Feign远程调用

目录 1.Feign替代RestTemplate1)引入依赖2)添加注解3)编写Feign的客户端4)测试5)总结 2.自定义配置2.1.配置文件方式2.2.Java代码方式 3.Feign使用优化4.最佳实践4.1.继承方式4.2.抽取方式4.3.实现基于抽取的最佳实践1…

老鼠走迷宫java ---递归

题目 有一个八行七列的数组,红色的格子代表墙,白色格子代表可以走的格子; 假定老鼠起点在map【1】【1】,设计算法帮老鼠找到到达终点map【6】【5】的路线。 思路 1.findWay方法就是专门来找出迷宫的路径 2.如果找到&#xff…

阿里测试师用UI自动化测试实现元素定位!

随着IT行业的发展,产品愈渐复杂,web端业务及流程更加繁琐,目前UI测试仅是针对单一页面,操作量大。为了满足多页面功能及流程的需求及节省工时,设计了这款UI 自动化测试程序。旨在提供接口,集成到蜗牛自动化…

第3章 Micro SaaS 的挑战

目录 1.对系统和平台的依赖 2.个人动力/责任随你而止 3.无尽的客户支持 4.模仿者 最后的想法 尽管 Micro SaaS 有很多好处,但这种商业模式并非没有其独特的缺点,您在开始时需要注意这些缺点。 以下是您需要了解的 Micro SaaS 的一些主要挑战&#…

BeanFactory和FactoryBean,ApplicationContext的关系

他们的区别比较容易理解,从字面意思就能区分开来,BeanFactory是Bean工厂,而FactoryBean是工厂BeanBeanFactory,Spring中工厂的顶层规范,他是IOC容器的核心接口,它的职责包括:实例化、定位、配置…

AIGC AI绘画 Midjourney 参数大全详细列表

AIGC ChatGPT 职场案例60集, Power BI 商业智能 68集, 数据库Mysql8.0 54集 数据库Oracle21C 142集, Office, Python ,ETL Excel 2021 实操,函数,图表,大屏可视化 案例实战 http:…

最新AI创作程序源码ChatGPT系统网站源码/Ai绘画系统/支持OpenAI GPT全模型+国内AI全模型/详细搭建部署教程

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统,支持OpenAI GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如何搭建部署AI创作Chat…

【audio】alsa pcm音频路径

文章目录 AML方案音频路径分析dump alsa pcm各个音频路径的原始音频流数据 AML方案音频路径分析 一个Audio Patch用来表示一个或多个source端到一个或多个sink端。这个是从代码的注释翻译来的,大家可以把它比作大坝,可以有好几个入水口和出水口&#xf…

回调函数兼函数指针与仿函数(谓词形式概论)

目录 前言 一、回调函数 1&#xff09;背景引入 2&#xff09;函数指针 3&#xff09;回调函数 4&#xff09;应用实例 &#xff08;1&#xff09;qsort() 库函数介绍 &#xff08;2&#xff09;void* 指针 &#xff08;3&#xff09;qsort() 调用实现 <> 函数指…

一种用于车联网安全数据共享的联邦双向连接宽度学习方案

A Federated Bidirectional Connection Broad Learning Scheme for Secure Data Sharing in Internet of Vehicles 由于IoV是一个多用户移动场景&#xff0c;数据共享的可靠性和效率需要进一步提高。联邦学习允许服务器在不从客户端获取私人数据的情况下交换参数&#xff0c;从…

细粒度特征提取和定位用于目标检测:PPCNN

1、简介 近年来&#xff0c;深度卷积神经网络在计算机视觉上取得了优异的性能。深度卷积神经网络以精确地分类目标信息而闻名&#xff0c;并采用了简单的卷积体系结构来降低图层的复杂性。基于深度卷积神经网络概念设计的VGG网络。VGGNet在对大规模图像进行分类方面取得了巨大…

1.1 基础热图绘制

1 写在前面 最近在作图&#xff0c;一直在寻找《小杜的生信笔记》前期发表的代码。众所周知&#xff0c;小杜的教程基本都是平时自己用到的绘图教程&#xff0c;也是自己一个分享和总结。 自己在后期作图的时候&#xff0c;也会去寻找自己前期的教程作为基础&#xff0c;进行…

Spring Cloud学习笔记【分布式请求链路跟踪-Sleuth】

文章目录 Spring Cloud Sleuth概述概述主要功能&#xff1a;Sleuth中的术语和相关概念官网 zipkin配置下载运行zipkin下载zipkin运行 demo配置服务提供者 lf-userpom.xmlapplication.ymlUserController 服务调用者 lf-authpom.xmlapplication.ymlAuthController 测试 Spring Cl…