导读:本期聚焦于小伙伴创作的《如何理解MySQL的Next-Key Lock?MySQL防幻读机制是如何实现的?》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何理解MySQL的Next-Key Lock?MySQL防幻读机制是如何实现的?》有用,将其分享出去将是对创作者最好的鼓励。

MySQL的InnoDB存储引擎在可重复读隔离级别下,通过Next-Key Lock机制实现了对幻读问题的防护,这是很多业务场景下保证数据一致性的重要基础逻辑。

如何理解MySQL的Next-Key Lock?MySQL防幻读机制是如何实现的?

Next-Key Lock的基本定义

Next-Key Lock是InnoDB引擎的一种复合锁,它由两部分组成:

  • 记录锁(Record Lock):对索引记录本身的加锁,防止其他事务修改或删除该条记录。
  • 间隙锁(Gap Lock):对索引记录之间的间隙加锁,防止其他事务往这个间隙中插入新的记录。

简单来说,Next-Key Lock锁定的是一个左开右闭的区间,比如对于索引值10,对应的Next-Key Lock区间是(5,10],其中5是前一个索引值,10是当前索引值。

Next-Key Lock的加锁规则

Next-Key Lock的加锁逻辑和查询使用的索引类型、查询条件密切相关,核心规则如下:

使用唯一索引的等值查询

如果查询条件是唯一索引的等值查询,且匹配到对应记录,InnoDB会优化为只加记录锁,不会加间隙锁。如果未匹配到记录,会加间隙锁锁定对应的间隙区间。

使用普通索引的等值查询

普通索引的等值查询会加Next-Key Lock,锁定匹配记录所在的区间,同时会向后扫描到第一个不满足条件的记录,对该记录加间隙锁。

范围查询

范围查询会锁定符合条件的所有记录,同时锁定这些记录对应的间隙区间,直到遇到第一个不满足范围条件的记录为止。

Next-Key Lock防幻读的实现逻辑

幻读指的是同一个事务中,两次执行相同的范围查询,第二次查询出现了第一次查询没有的新记录。Next-Key Lock通过锁定间隙,阻止其他事务插入符合查询条件的新记录,从而避免幻读。

我们来看一个具体的示例,首先创建测试表和测试数据:

-- 创建测试表,id为普通索引
CREATE TABLE test_next_key (
    id INT,
    name VARCHAR(20),
    INDEX idx_id (id)
) ENGINE=InnoDB;

-- 插入测试数据
INSERT INTO test_next_key VALUES (1, 'a'), (3, 'b'), (5, 'c'), (7, 'd');

开启两个事务,事务A执行范围查询并加锁:

-- 事务A
START TRANSACTION;
-- 查询id大于3小于7的记录,加排他锁
SELECT * FROM test_next_key WHERE id > 3 AND id < 7 FOR UPDATE;

此时事务A会对id=5的记录加记录锁,同时对(3,5]和(5,7]两个区间加间隙锁,也就是锁定了(3,7)这个整个区间。

此时事务B尝试插入符合查询条件的新记录:

-- 事务B
START TRANSACTION;
-- 尝试插入id=6的记录,该记录属于事务A锁定的区间
INSERT INTO test_next_key VALUES (6, 'e');
-- 该语句会被阻塞,直到事务A提交

因为事务B插入的id=6的记录落在事务A锁定的(3,7)区间内,所以插入操作会被阻塞,直到事务A提交释放锁之后才能执行。这样事务A再次执行相同的范围查询时,就不会出现新的记录,从而避免了幻读。

注意事项

  • Next-Key Lock只在可重复读和串行化隔离级别下生效,读已提交隔离级别下只会加记录锁,无法防幻读。
  • 如果查询没有使用索引,InnoDB会进行全表扫描,此时会对所有记录的间隙加锁,相当于锁表,会影响并发性能。
  • 间隙锁之间不会互斥,多个事务可以同时持有相同区间的间隙锁,但是插入操作会因为记录锁的互斥被阻塞。

理解Next-Key Lock的逻辑,能帮助我们在开发过程中合理设计索引和查询语句,避免不必要的锁冲突,同时保证业务数据的一致性。

MySQLNext_Key_Lock防幻读事务隔离级别修改时间:2026-06-19 20:15:26

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。