NEWS DETAIL

面试官:什么是 Next-Key Lock?作用是什么?

发布时间:2026/10/24 15:42:50 · 栏目:资讯中心

尧图网络原创建站知识分享正文
Next-Key Lock 是 InnoDB 存储引擎中非常基础也是非常重要的一个锁。今天来聊一聊 Next-Key Lock。首先我们回顾一下 MySQL 的事务隔离级别。串行化Serializable事务对数据读写都是串行的。可重复读Repeatable Read事务执行过程中多次读取同一行数据读取结果一致。MySQL 默认隔离级别就是可重复读。读已提交数据Read Committed事务执行过程中如果有其他事务修改了数据并且提交事务当前事务可以读取到最新提交的数据。读未提交数据Read Uncommitted事务执行过程中可以读取到其他事务未提交的数据。可重复读隔离级别解决了幻读问题而解决的方式就是通过 MVCC 和 Next-Key Lock。幻读同一事务内多次查询同一范围内的数据因其他事务插入或删除符合条件的数据导致事务在后面读取到的结果集不一样像产生了幻觉。介绍Next-Key Lock 是间隙锁gap lock和行锁index-record lock的组合。行锁 锁定索引中的某一条具体记录。间隙锁 锁定索引记录之间的间隙它锁定的是一个范围这个范围内不存在数据。例如如果锁定了 (10, 20) 这个范围那其他事务就不能在这个范围内插入新记录。一个 Next-Key Lock也就是行锁加上该行之前的间隙锁因此它锁定的是一个前开后闭区间。我们假设有一张表 t包含idab3 个字段其中 id 是主键字段 a 上面有普通索引字段 b 没有索引。建表语句如下CREATE TABLE t ( id int(10) NOT NULL, a int(10) DEFAULT NULL, b int(10) DEFAULT NULL, PRIMARY KEY (id), KEY idx_a (a)) ENGINEInnoDB;表中有 4 条记录分别555101010151515202020那如果执行下面语句select * from t where id 7 for update;这样会对 id 10 的记录加 Next-Key Lock锁定的是 (5, 10] 这个区间也就是说除了锁住 id 10 这条记录行锁同时间隙锁锁住了 5 和 10 之间的间隙510。而如果执行下面这条 SQL则会对整张表加 Next-Key Lock因为字段 b 没有索引新插入的数据都可能包含 b 6。加锁后形成 5 个范围select * from t where b 6 for update;加上了 Next-Key Lock可以阻止其他事务在被锁定的间隙中插入新的记录从而保证了当前事务中多次执行相同查询时不会有新的记录查出来解决了幻读问题。在可重复隔离级别下执行下面几个 SQL 时都可能会对扫描过程中访问到的记录加 Next-Key LockSELECT * from t where id xxx FOR UPDATE;//id 不存在 SELECT * from t where a xxx FOR UPDATE; SELECT * from t where b xxx FOR UPDATE; SELECT * from t where id BETWEEN 10 AND 20; SELECT * from t where id xxx LOCK IN SHAREMODE; UPDATE t set b xxx where id yyy; DELETE from t where id yyy;非唯一索引和无索引的字段都可能会匹配多条记录所以会加 Next-Key Lock。那如果查询的 id 存在还会加 Next-Key Lock 吗 比如上面的表执行 SQLSELECT * from t where id 10 for update;答案是不会加 Next-Key Lock这个时候 Next-Key Lock 退化成了行锁。查询语句符合下面三个条件时Next-Key Lock 会退化成行锁查询使用的是唯一索引SQL 条件是等值匹配比如 WHERE unique_key X扫描到的记录确定存在。如果上面 3 个条件有一个不符合 都会加 Next-Key Lock。另一点虽然 Next-Key Lock 是前开后闭区间如果索引上等值查询向右遍历到最后一个值不满足等值条件则退化为间隙锁。比如执行下面 SQLSELECT * from t where id 8 for update;Next-Key Lock 退化为间隙锁加锁范围是(5,10)。id 10 的这条记录不影响其他事务修改操作。优缺点优点解决了 REPEATABLE READ 隔离级别下幻读问题有效保证了数据一致性。缺点 增加了锁的粒度一定情况下会降低并发性能并增加死锁发生的概率。因为多个事务可能以不同的顺序请求对重叠的间隙加锁很容易造成死锁。下面是一个死锁的案例事务 A 准备插入一条888的记录事务 B 准备插入一条999的记录其他他们相互不影响但加了 Next-Key Lock就容易造成死锁。事务 A事务 Bselect * from t where id 8 for updateselect * from t where id 9 for updateinsert into t values9,9,9;insert into t values8,8,8;这样两个事务都会加5,10这个间隙锁最终相互等待形成死锁。为什么两个事务都可以加上间隙锁因为间隙锁之间不会冲突。总结Next-Key Lock 是 InnoDB 引擎行锁加间隙锁的组合它锁住的是一个前开后闭的区间消除了 REPEATABLE READ 隔离级别下的幻读问题。理解 Next-Key Lock 要把握两点可重复隔离级别下才会生效锁住一个前开后闭的区间但一定条件下可能退化成行锁或者间隙锁。
✦

本文为尧图网络原创建站知识分享。想针对自身行业获取定制化建站方案?欢迎咨询,资深顾问免费为你出思路。

RELATED

相关 资讯推荐

MORE

更多 新鲜资讯

JMeter入门实战:从零构建HTTP接口性能测试脚本与结果分析
2026/10/21 11:24:40

JMeter入门实战:从零构建HTTP接口性能测试脚本与结果分析

1. 项目概述:从零开始,用JMeter搞定HTTP性能测试 刚接触性能测试的新手,或者是从功能测试转过来的朋友,一听到“压测”两个字,心里可能就有点发怵。工具那么多,概念那么杂,从哪儿下手呢&#xf…

Earendel: 一个纯TS写的POSIX兼容的微内核Web操作系统
2026/10/22 18:46:31

Earendel: 一个纯TS写的POSIX兼容的微内核Web操作系统

最近我用TypeScript写了一个运行在浏览器里的Web操作系统 Earendel(目前已知的距离地球最遥远的恒星)。开发它的初衷主要是为了Linux和操作系统课程的教学。市面上绝大多数Web OS项目,要么只是做了一个长得像Windows/macOS的网页UI拼盘&#…

5分钟掌握Windows防撤回神器:让微信QQ撤回消息无处遁形[特殊字符]
2026/10/19 6:46:54

5分钟掌握Windows防撤回神器:让微信QQ撤回消息无处遁形[特殊字符]

5分钟掌握Windows防撤回神器:让微信QQ撤回消息无处遁形🚀 【免费下载链接】RevokeMsgPatcher :trollface: A hex editor for WeChat/QQ/TIM - PC版微信/QQ/TIM防撤回补丁(我已经看到了,撤回也没用了) 项目地址: http…

从零制作同人动画:技术路线、流程与实战避坑指南
2026/10/24 7:09:28

从零制作同人动画:技术路线、流程与实战避坑指南

1. 先搞清楚这个“粉丝动画”到底是什么,以及它能解决什么问题看到“五条悟VS宿傩/咒术回战粉丝动画”这个标题,很多人的第一反应可能是去找一个现成的视频。但如果你是一个想自己动手创作、或者想了解这类作品背后技术流程的创作者,这个标题…

闭源降价80%,开源却在涨价:AI定价的交叉路口
2026/10/23 15:38:44

闭源降价80%,开源却在涨价:AI定价的交叉路口

8月6日,两条价格曲线悄然交汇。 一条向下:OpenAI把GPT-5.6 Luna的输出价格从6美元砍到1.2美元/百万Token,降幅80%。另一条向上:同一天,DeepSeek公告全线涨价,措辞是"涨幅较大",非试探…

产线三防平板选哪个牌子?5个品牌实测告诉你别瞎买
2026/10/23 10:16:26

产线三防平板选哪个牌子?5个品牌实测告诉你别瞎买

产线三防平板选哪个牌子?5个品牌实测告诉你别瞎买经常有工厂朋友拿着网上的"三防平板十大品牌排行榜"来问我:到底选哪个?说实话排行榜看看就行,真正选型得看你产线什么场景。今天挑五个在产线数字化里用得比较多的品牌—…

看完这篇,还想了解更多?

预约尧图网络顾问一对一沟通,针对你的行业与现状给出建站建议,全程免费。

免费咨询