什么是间隙锁

article/2025/9/15 3:54:45

中心思想

间隙锁锁的是索引叶子节点的next指针。

意义

解决了mysql RR级别下是幻读的问题。

快照读

在RR隔离级别下:快照读有可能读到数据的历史版本,也有可能读到数据的当前版本。所以快照读无需用锁也不会发生幻读的情况。

当前读

当前读:select…lock in share mode,select…for update
当前读:update,delete,insert

读取的是记录的最新版本,所以所以就需要通过加锁(行锁 间隙锁 表锁)的方式,使得被当前读读过的数据不能被新增修改或者删除,换句话说再来一次当前读要返回相同的数据。

为什么需要间隙锁

数据表

CREATE TABLE `z` (`id` int(11) NOT NULL AUTO_INCREMENT,`b` int(11) DEFAULT NULL,`c` int(255) NOT NULL DEFAULT '0',PRIMARY KEY (`id`),KEY `b` (`b`)
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;INSERT INTO `study`.`z` (`id`, `b`, `c`) VALUES ('1', '1', '0');
INSERT INTO `study`.`z` (`id`, `b`, `c`) VALUES ('3', '6', '1');
INSERT INTO `study`.`z` (`id`, `b`, `c`) VALUES ('5', '4', '2');
INSERT INTO `study`.`z` (`id`, `b`, `c`) VALUES ('7', '8', '3');
INSERT INTO `study`.`z` (`id`, `b`, `c`) VALUES ('8', '10', '4');

索引B结构

锁加在哪里

begin; select * from z where b = 6 for update;

这条sql语句之后看看我们 需要做什么才能保证不发生幻读。

1不能插入b为6的数据

2不能删除b为6的数据

3不能修改b为6的数据

4不能把别的数据修改为b为6

突然一看挺复杂的,这个锁要怎么加呢,mysql大牛灵机一动,给叶子节点5的next指针加锁,给叶子节点3加行锁,给叶子节点3的next指针加锁。如下图所示

这样不就能把上述四个问题解决了么,两个next指针锁解决了插入b为6或者把别的数据修改为b为6,行锁解决了修改b为6的行,但是呢也带来一些明显的副作用。

例如

INSERT INTO `study`.`z` (`id`, `b`, `c`) VALUES ('6', '4', '0'); 

 会bolck因为按照索引结构这条数据会插入到叶子结点5和3之间,会修改叶子节点5的next指针,虽然这条sql没有破坏上述的4个红色条件但是依然被阻塞了所以我叫它为副作用。

INSERT INTO `study`.`z` (`id`, `b`, `c`) VALUES ('4', '4', '0'); 

 插入成功因为这条数据会插入在1的后面5的前面。

现在大家是不是能理解间隙锁的怪异行为了呢。

间隙锁范围

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

会锁住主键索引叶子节点的3的next指针。(为啥呢,需要你自己画主键索引的图)

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

间隙锁会退化为行锁只锁叶子节点3 ,为什么因为没必要。不加间隙锁也不会打破上述的红色4个条件。

begin; 
select * from z where id>4 for update;

叶子节点3及之后所有节点会加行锁并且他们的next指针会加锁,

begin; 
select * from z where c=2 for update;

会发生锁表,因为c没有索引结构能存储行锁或者间隙锁。

 


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

相关文章

MySql进阶-间隙锁(gap-key)

文章目录 Innodb锁算法关闭Gap LockGap-key 解决的问题间隙锁影响MVCC 核心原理ReadView 可参考 快照读,当前读可参考 参考《InnoDB存储引擎》 注意:gap-key是innodb存储引擎来解决当前读的幻读问题的。对于隔离级别下的可重复读只能解决快照读的幻读问题…

dubbo接口调试工具

最近的项目使用来dubbo进行开发,虽然可以使用telne客户端t进行dubbo的接口的调试,但总感觉调试起来不太方便,并且限制太多,于是抽了点时间出来编写了一个dubbo的客户端可视化调试工具,功能虽简单但可以快速的调试dubbo…

Android Studio调试工具总结

前言:写代码不可避免有Bug,通常情况下除了日志最直接的调试手段就是debug;当我们的程序出现bug时,调试可以快速的找到bug。进入调试状态,我们可以清楚的了解程序的整个执行过程,可以对内存的数据进行监视。…

串口调试、udp 调试、tcp 调试,websocket 调试,通讯调试工具

简介 一个通讯测试工具,QSAK(Qt Swiss Army Knife)是一款基于Qt开源框架打造的多功能、跨平台调试工具。目前支持串口调试、udp 调试、tcp 调试及 websocket 调试等。支持 Windows、Linux、raspberry pi 等平台。 免费、开源、绿色、免安装…

chrome--浏览器调试工具详解

chrome浏览器开发调试工具打开方式:F12键 一,常用面板介绍 1.定位小箭头按钮(左边第一个): 选中Elements面板,并启动该按钮,可以在页面中定位相应元素的源代码位置,或者选择源代码位置可定位到页面相应的元…

通讯调试工具推荐

CommBox通讯调试工具-简单说明 工具支持:串口通讯、串口代理、TCP、UDP、Telnet、Ping、TFtp、串口监视、以太网嗅探等通讯测试 1、本工具支持预定义命令,命令可以进行分组,由树形控件管理。点击“命令编辑”即可编辑预…

modbus调试工具的使用

modbus调试工具的使用分为2部分,2者互相不影响,可以单独使用。 一、根据IP进行模拟通信 二、根据COM进行模拟通信 一、根据IP进行模拟通信 1.安装完成ModbusPollSetup64Bit后,输入注册码进行注册;安装完成ModbusSlaveSetup64Bi…

两款常用的 MQTT 调试工具

文章目录 一、前言二、预备知识三、MQTTBox1、介绍2、下载3、入门使用4、负载测试 四、MQTT.fx1、介绍2、下载3、入门使用4、JS 脚本 一、前言 我们可以使用 MQTT 客户端来测试 MQTT 的通讯功能,这里介绍常用的两款工具 MQTTBox 和 MQTT.fx 。 二、预备知识 MQTT…

简易Window BLE调试工具

简易Windows BLE调试工具 一、简介 Windows BLE调试工具是一款运行在Windows下的BLE调试软件,实现了扫描、连接、获取BLE设备上的服务以及向服务写入和读取数据的功能。 二、运行要求 系统需要使用Windows 10及以上的版本;需要电脑带有蓝牙功能或者使用外接蓝牙…

wsdl在线调试工具

1.下载soapui 2.进行调试 注:1.wsdl地址在测试服务器上一定要能联通 2.测试时如果是xml标签,需要进行转义 http://www.ku51.net/rehtml/ 3.在wsdl地址后面拼接?wsdl能够看到具体的接口信息 3.使用post进行请求示例

【sscom】 串口调试工具

这款串口调试工具我是经常使用的,这里推荐给大家,功能比较全面。 1、正常的串口调试功能。 2、可以保存一些经常发送的数据内容。 3、可以作为网络调试工具使用。 关注公众号:逸趣汇 微信号:yiquhui666 发送:010201 …

移动端开发调试工具

1、抓包工具Charles、Fiddler 平时只用抓取各种网络,需要设置手机的wifi代理 推荐指数2颗星 2、vConsole、eruda等调试库 这个方法需要在页面中插入一段 JS 脚本,这里以vConsole为例,导入vconsole.min.js,并实例化,…

串口通信工具android,串口调试工具手机版

串口调试工具手机版是一款针对OTG接口开发的串口调试应用,这款软件提供了文本、HEX码等多种格式,支持12个自定义按钮,支持自动重发功能,并提供了15种常用波特率,需要的朋友可以来西西下载串口调试工具手机版进行使用 串…

HTTP调试工具

HttpDebug HTTP协议调试工具 V1.02 英文绿色免费版 https://www.jb51.net/softs/43863.html postman的使用方法详解!最全面的教程 https://www.cnblogs.com/jpfss/p/9082542.html 一 简介 Postman是一款功能超级强大的用于发送 HTTP 请求的 Chrome插件 。做web页…

Windows下的TCP/UDP网络调试工具-NetAssist以及Linux下的nc网络调试工具

已剪辑自: https://blog.csdn.net/ccf19881030/article/details/109370384 一、Windows下的网络调试工具-NetAssist 1、TCP服务端和客户端测试2、UDP服务端和客户端测试 二、Linux下的网络调试命令工具-nc 1、什么是nc2、nc的作用3、在CentOS7中安装nc命令工具[4、NetCat 官方…

串口调试工具推荐

作者:三十三重天 博客: http://www.zhouhuibo.club 沉淀、分享、成长,让自己和他人都能有所收获!😜 在进行嵌入式开发时,总是要面对着来自终端的各种报文。不同的设备、终端厂商都有一套自己的报文协议,如何…

PostWomen websocket 调试工具

PostWomen是一款websocket调试工具,补充了post man没有websocket调试的遗憾 源代码 https://gitee.com/ichiva/post-women演示地址 新版浏览器已不支持 ws 链接,请使用 wss 链接实测本地 ws 链接任然可用,如 ws://127.0.0.1 或 ws://localhost http://ichiva.gi…

嵌入式开发<网络调试工具>

嵌入式开发<网络调试工具> 前言1&#xff0c;设备参数分类2&#xff0c;设备参数修改3&#xff0c;调试工具软件 一、软件界面二、功能说明1.网络设置1&#xff09;TCP Client设置A&#xff0c; 协议类型&#xff1a;B&#xff0c; 远程主机地址&#xff1a;C&#xff0c…

Linux串口调试工具

linux系统下串口调试和应用开发时配合串口调试工具必不可少。下面对常用的一些串口工具做一下汇总&#xff0c;包含&#xff1a;minicom/cutecom/picocom/putty/tty_uart 可供工程师参考。 实验环境&#xff1a; OS: Ubuntu16.04 ------------------------------------------…

android js调试工具,鬼鬼JS调试工具

鬼鬼JS调试工具是一款非常实用的JS调试软件&#xff0c;这里带给大家最新版本&#xff0c;新增了一些解密等功能&#xff0c;对于JS调试工作者或者感兴趣的朋友提供稳定和强大的调试支持。鬼鬼JS调试工具具有直观的界面设计&#xff0c;功能十分全面&#xff0c;有需要的朋友欢…