千家信息网

MYSQL 从Record lock 到 Next-Key Locks 到 GAP_LOCK的示例分析

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,本篇文章给大家分享的是有关MYSQL 从Record lock 到 Next-Key Locks 到 GAP_LOCK的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所
千家信息网最后更新 2026年10月31日MYSQL 从Record lock 到 Next-Key Locks 到 GAP_LOCK的示例分析

本篇文章给大家分享的是有关MYSQL 从Record lock 到 Next-Key Locks 到 GAP_LOCK的示例分析,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

大多数人第一次提到锁,可能认为锁可能是针对磁盘上的物理的数据记录,实际上,所有的操作都在内存中完成,锁怎么可能是针对磁盘上的物理数据呢?

在认识到锁都是在内存中产生的后,锁是在什么范围,怎么进行的锁,等等就是进一步需要了解的。

MySQL 中有以下几种锁, Record lock, Gap lock, Next-key lock.

Record lock 是基于索引记录的,也就是他上锁的目标不是记录本身而是索引。那有人就提出异议了,我不建索引,我没有主键,我没有聚簇索引,你奈我何。

你怎么枷锁我,实际上MYSQL的在你不做任何以上的工作时,MYSQL 会无奈的给你一个,A hidden Clustered index, (所以,建MYSQL 不自己建立聚簇索引,属于对MYSQL 耍流氓的行为) ,所以我看见MYSQL不建立主键,并且用UUID的行为我对此是 "极度的遗憾"。

Next-key lock 这个东西默认是在你MYSQL 在 REPEATABLE READ 模式下,防止你幻读的。具体Next-key lock 使用对INDEX 行锁进行GAY LOCKING.

那为什么要特意搞清楚 NEXT-KEY LOCK ,原文档有这样一句话,他说一个 next-key lock 就是一个索引记录锁加上一个GAP 锁, 如果一个session拥有了 S or X 锁(这里我们先不考虑 IX IS),其他的Session 将不能插入一个新的INDEX RECORD 在间隙锁INDEX 记录之前的位置。

估计说完这句话,more people will be dizziness.

举个例子,我们有以下索引值 id 10,11,13,20

用索引值来表达的 (负无限,10】(10,11】 (11,13】 (13,20】 (20,正无限)

官方文档下面就跟着一句话,NEXT-KEY LOCK 将锁定索引最大值的间隙,In effect, this next-key lock locks only the gap following the largest index value. 这意味这什么,请打开你的脑洞,这样的操作会对插入有什么影响。

Gap lock 首先 Gap lock只存在于 repeatable read isolation level,在这个level 里面Gap lock才存在。

我们继续上面的那个10,11,13,20的例子,

下面有三个 session 同时运行

Session A

update table set m=m+3 where id =14;

Session B

insert into table (id) values (16);

Session C

insert into table (id) values (21);

则结果 session B 插入数据会失败,因为GAP LOCK 将(13,20】 这一段的索引值都锁上了,不允许在这之间进行数据的插入。

而 Session C 则可以直接插入数据,因为到了20时,值是闭合的。

所以在MYSQL的isolation 选择中,如果你选择了repeatable read, 就意味着你的MYSQL 更要付出更多的心思在语句的设计上,稍不留意,你的MYSQL 就只能不断了报 BLOCK 的错误。

我们在举一个例子

Session A

select * from table where id > 10 and id < 20 for update;

Session B

Insert into table (id) varlues (14);

Session C

insert into table (id) values (21);

这里的结果是 Session B and Session C 都会失败。

原因是next-key lock 范围锁。

使用 repeatable isolation 的MYSQL 会遇到更多的锁和BLOCK的问题,所以这里建议,MYSQL 不要使用 repeatable isolation ,同时唯一索引在MYSQL 中的性能其实也还值得深究,(其实有些大表在处理唯一索引的时候也是如履薄冰,有坑)

我们最后在来一个死锁的案例

session A

begin

select id from table where id = 20 in share mode; (+S)

insert into table (id) values (15)

end

session B

update table set column = column +1 where id = 20;

这样直接session b 会死锁。

这就是repeatable isolation 下的MYSQL NEXT-KEY LOCK & GAP LOCK 会遇到的问题。所以........ 我就不多说了。

以上就是MYSQL 从Record lock 到 Next-Key Locks 到 GAP_LOCK的示例分析,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

索引 数据 就是 更多 例子 是在 示例 分析 一句话 内存 同时 实际 实际上 意味 文档 物理 知识 磁盘 篇文章 结果 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 耶加雪菲 西安纸贵互联网科技有限公司 科技创新与互联网经济 互联网科技集团 新浪科技互联网 齐家互联网科技有限公司 广州优美互联网科技 中国互联网有什么科技含量 银川新华互联网科技职业技术培训学校图片 互联网校园科技培训 福建科技产业互联网发展 苏州铭阳互联网科技有限公司 科技赋能视角下互联网保险发展 互联网领先科技宣传片 抖集互联网科技技术咨询 兰石爱特工业互联网科技分公司 玉溪新华互联网科技怎么选 安徽零酒互联网科技有限公司 现代互联网科技公司 承德科技产业互联网平台 互联网科技园 互联网科技名片 友谊互联网络科技 海南科技产业互联网平台 互联网实体化科技化 洛阳共同富裕互联网科技有限公司 35岁以上互联网科技行业 郑州欣桑互联网科技有限公司 广东鹅鹅鹅互联网科技有限公司 科技和互联网行业的特点
0