【MySQL】MySQL的锁机制 - 记录锁、间隙锁、临键锁

article/2025/9/15 23:33:04

目录

  • 一、参考链接
  • 二、总结
    • 1、间隙锁的目的
    • 2、什么时候产生间隙锁?
    • 3、间隙锁锁定的范围
    • 4、需要注意的点(重要)
  • 三、案例
    • 建表
    • 案例1:查询已存在的单条记录
    • 案例2:查询不存在的记录
    • 案例3:查询多条记录(范围查询)
  • 四、其余验证

一、参考链接

  1. MySQL的锁机制 - 记录锁、间隙锁、临键锁

  2. Mysql间隙锁
     

二、总结

1、间隙锁的目的

间隙锁的目的是为了防止幻读,其主要通过两个方面实现这个目的:
(1)防止间隙内有新数据被插入
(2)防止已存在的数据,更新成间隙内的数据
 

2、什么时候产生间隙锁?

在 RR 级别下,Gap 锁是默认开启的,而在 RC 级别下,Gap 锁是关闭的。

(1)字段是唯一索引时,只有查询某个范围记录或者一条不存在的记录的时候,才会产生间隙锁,指定给某条存在的记录加锁的时候,只会加记录锁,不会产生间隙锁;

(2)字段是普通索引时,不管是锁住单条,还是多条记录,都会产生间隙锁;
 

3、间隙锁锁定的范围

根据检索条件向左寻找最靠近检索条件的记录值A,作为左区间,向右寻找最靠近检索条件的记录值B作为右区间,即锁定的间隙为(A,B)。
 

4、需要注意的点(重要)

普通索引的间隙,优先以普通索引排序,然后再根据主键索引排序(多普通索引情况还未研究);
 

三、案例

通过几个案例来验证总结里的结论,加深印象。

建表

CREATE TABLE `test_gap_table` (`id` bigint unsigned NOT NULL AUTO_INCREMENT,`number` bigint DEFAULT NULL,PRIMARY KEY (`id`),KEY `idx_number` (`number`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;INSERT INTO test_gap_table ( id, number ) VALUE ( 1, 2 );
INSERT INTO test_gap_table ( id, number ) VALUE ( 3, 4 );
INSERT INTO test_gap_table ( id, number ) VALUE ( 6, 5 );
INSERT INTO test_gap_table ( id, number ) VALUE ( 8, 5 );
INSERT INTO test_gap_table ( id, number ) VALUE ( 10, 5 );
INSERT INTO test_gap_table ( id, number ) VALUE ( 13, 11 );

number为普通索引。
 
number索引的结构基本与下图类似。
在这里插入图片描述

 
接下来开始验证,注意,验证前,需要先关闭mysql的自动提交

show variables like '%autocommit%';

验证过程中可以通过show processlist命令查看数据库连接信息。

`SHOW PROCESSLIST` 是一个MySQL命令,用于显示当前数据库连接的进程列表。
它可以显示当前正在执行的所有查询和连接到数据库服务器的客户端信息。该命令返回一个结果集,其中包含每个连接的详细信息,如连接ID、用户、主机、数据库、当前状态、执行的语句等。
通过执行 `SHOW PROCESSLIST`,你可以查看当前数据库服务器上的活动连接和执行的查询,以便进行性能监控、诊断和调优。这个命令对于管理员和开发人员来说非常有用,可以帮助他们了解数据库服务器的负载情况,发现潜在的问题和优化机会,以及终止或杀死
执行时间过长或占用过多资源的查询。需要注意的是,`SHOW PROCESSLIST` 命令的执行本身也会占用一定的系统资源,因此在生产环境中使用时要谨慎,避免过度频繁地执行该命令。

在这里插入图片描述

 

案例1:查询已存在的单条记录

session 1:
start transaction;//也可以是begin
select * from test_gap_table where number=4 for update;session 2:
start transaction;
insert into test_gap_table value(2,4);#(阻塞)
insert into test_gap_table value(2,2);#(阻塞)
insert into test_gap_table value(4,4);#(阻塞)
insert into test_gap_table value(7,4);#(阻塞)
insert into test_gap_table value(4,5);#(阻塞)
insert into test_gap_table value(7,5);#(执行成功)
insert into test_gap_table value(9,5);#(执行成功)
insert into test_gap_table value(11,5);#(执行成功)

检索条件number=4,向左取得最靠近的值2作为左区间,向右取得最靠近的5作为右区间,因此,session 1的间隙锁的范围(2,4),(4,5),如下图所示:
在这里插入图片描述

这里(2,4)插入的时候阻塞,原因可以看上边的总结-4,当number相同时,会根据id来排序,所以根据索引的数据结构特征,如果(2,4)要插入的话将被放在间隙1中,但是间隙1被锁定,所以发生阻塞。(2,2)、(4,4)、(4,5)都是同理。(7,5)能执行成功是因为它会被放在(id=6,number=5)和(id=8,number=5)中间,不属于被锁定的间隙所以能成功。

在这里插入图片描述
从图中可以看出,当 number 相同时,会根据主键 id 来排序,所以(2,4)、(4,4)等情况才会阻塞。

如果能理解上边锁定和阻塞的情况,其余情况也就都能掌握了。

案例2:查询不存在的记录

session 1:
start transaction;
select * from test_gap_table where number=13 for update ;session 2:
start transaction;
insert into test_gap_table value(11,5);#(执行成功)
insert into test_gap_table value(12,11);#(执行成功)
insert into test_gap_table value(14,11);#(阻塞)
insert into test_gap_table value(15,12);#(阻塞)
update test_gap_table set id=14 where number=11;#(阻塞)
update test_gap_table set id=11 where number=11;#(执行成功)

检索条件number=13,向左取得最靠近的值11作为左区间,向右由于没有记录因此取得无穷大作为右区间,因此,session 1的间隙锁的范围(11,无穷大)。阻塞情况与 案例1 原理相同,不再赘述。

案例3:查询多条记录(范围查询)

session 1:
start transaction;
select * from test_gap_table where number>4 for update;session 2:
start transaction;
update test_gap_table set id=2 where number=4 ;#(执行成功)
update test_gap_table set id=4 where number=4 ;#(阻塞)
update test_gap_table set id=5 where number=5 ;#(阻塞)
insert into test_gap_table value(2,3);#(执行成功)
insert into test_gap_table value(null,13);#(阻塞)

检索条件number>4,向左取得最靠近的值4作为左区间,向右取无穷大,因此,session 1的间隙锁的范围(4,无穷大)。

session2中之所以有些阻塞,有些执行成功,其实就是因为插入的区域被锁定,从而阻塞。
 

四、其余验证

这个是最早做的一次间隙锁的验证,没有考虑普通索引相同情况下id的情况。
示例:
在这里插入图片描述


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

相关文章

MySQL的锁机制 - 记录锁、间隙锁、临键锁

记录锁(Record Locks) 记录锁是 封锁记录,记录锁也叫行锁,例如: SELECT * FROM test WHERE id1 FOR UPDATE; 它会在 id1 的记录上加上记录锁,以阻止其他事务插入,更新,删除 id1 这一行。 记录锁、间隙锁…

行锁、间隙锁、next-key锁

参考博客:cmysql锁(九)innodb下的记录锁,间隙锁,next-key锁 - 简书 Mysql 行锁、间隙锁和next-key锁详解_程序员掉头发的博客-CSDN博客_行锁 间隙锁 行锁(Record Lock): 对索引记录加锁。间隙锁(Gap Lock…

mysql记录锁、间隙锁、临键锁

名词解释 记录锁:record lock,即锁住一条记录 间隙锁:gap lock,即锁定一个区间,左开又开 临键锁:记录锁间隙锁锁定的区间,左开右闭 mysql如何加锁 假设有如下数据 其中,id 是主键索引(唯一索…

【MySQL】记录锁?间隙锁?临键锁?到底锁了些什么?这一篇帮你捋清楚( ̄∇ ̄)/

特别强调~ 本测试使用的是MySQL 8.0.27~ 8.0.27~ 8.0.27(因为不同版本命令可能会有差异哈) 打开两个终端,分别连接上MySQL,使用select global.transaction_isolation;查看隔离级别&#xff08…

MySQL的锁机制——记录锁、间隙锁、临键锁

记录锁(Record Locks) 记录锁锁住的是索引记录,记录锁也叫行锁。如果使用索引作为条件命中了记录,那么就是记录锁,被锁住的记录不能被别的事务插入相同的索引键值,修改和删除。 例如: select * from test_table whe…

mysql 间隙锁

一、什么是间隙锁? 间隙锁(Gap Lock):锁加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一个索引记录之前或最后一个索引之后的空间。 当我们用范围条件而不是相等条件索引数据,并请求…

什么是间隙锁

中心思想 间隙锁锁的是索引叶子节点的next指针。 意义 解决了mysql RR级别下是幻读的问题。 快照读 在RR隔离级别下:快照读有可能读到数据的历史版本,也有可能读到数据的当前版本。所以快照读无需用锁也不会发生幻读的情况。 当前读 当前读&#…

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种常用波特率,需要的朋友可以来西西下载串口调试工具手机版进行使用 串…