0

0

mysql next key lock如何理解_mysql事务防护说明

P粉602998670

P粉602998670

发布时间:2026-02-02 10:14:02

|

748人浏览过

|

来源于php中文网

原创

Next-Key Lock 是 Record Lock 与 Gap Lock 的组合,仅在 REPEATABLE READ 级别下由 InnoDB 自动启用,用于防止幻读,锁定左开右闭区间(如 (90, 102]),其加锁范围取决于索引类型、查询条件及数据分布。

mysql next key lock如何理解_mysql事务防护说明

Next-Key Lock 是什么?一句话说清

Next-Key Lock 不是新锁类型,而是 Record Lock(锁某一行) + Gap Lock(锁两个值之间的空隙)的组合体,只在 REPEATABLE READ 隔离级别下由 InnoDB 自动启用,专为堵住幻读而生。

它锁的是「左开右闭区间」,比如 (90, 102]:不锁 90 这个点,但锁 102 这行 + 所有 90~102 之间的插入可能。你没写 FOR UPDATELOCK IN SHARE MODE,它就不会触发;一旦用了,影响远超直觉。

什么时候真正用上 Next-Key Lock?看查询方式

加锁不是拍脑袋全表扫,而是严格按索引查找路径走,只锁「访问到的索引项」及其对应区间。关键看三点:隔离级别、是否带锁读、查询条件类型。

  • SELECT ... WHERE id = 15 FOR UPDATE(主键等值查)→ 退化为纯 Record Lock,只锁 id=15 这一行
  • SELECT ... WHERE age = 25 FOR UPDATE(普通索引等值查,且 age=25 存在)→ 锁 (24, 25](25, 26] 这类相邻间隙,实际可能卡住 age=25.5 的插入(如果字段允许小数)
  • SELECT ... WHERE age > 30 FOR UPDATE(范围查)→ 典型 Next-Key 场景,比如当前最大 age 是 35,就可能锁 (30, 35](35, +∞)
  • WHERE 字段没索引 → InnoDB 退化为全表扫描,对每条聚簇索引记录都加 Next-Key Lock,相当于整张表被锁死,极易阻塞其他事务

为什么必须靠它防幻读?MVCC 为啥不行

MVCC 能挡脏读、不可重复读,但对 INSERT 无感——它不改旧行,只加新行,快照里自然看不到“未来插入”的数据。幻读的本质是:同一事务内,两次相同范围查询,第二次多出新插入的行。

CodeFormer
CodeFormer

CodeFormer是一个基于AI技术的图像修复模型,擅长人脸修复和旧照片清晰化。

下载

仅靠 Record Lock:能锁住已存在的 id=102,但拦不住别人插 id=101;
仅靠 Gap Lock:能锁 (90, 102) 防插入,但若已有 id=101,它又不锁这行本身,别人还能改它;
Next-Key Lock 合力出手:既锁命中行,又锁它左边间隙,真正封死“该范围内增删改”的所有可能。

实战中最容易踩的坑

你以为只锁了 WHERE 条件里的值,其实锁了一整片区域;你以为查不到的记录就没事,结果它锁了整个空隙;你以为只是 SELECT,结果加了锁还阻塞 INSERT —— 这些都是 Next-Key Lock 的隐形杀伤力。

  • 看似 WHERE age = 25,但如果 age 是普通索引,且表里有 age=24 和 age=26,那它实际锁的是 (24, 26],别人插 age=25.5 也会被卡住
  • UPDATE ... WHERE 只锁命中的行(Record Lock),除非 WHERE 是范围条件;但 SELECT ... FOR UPDATE 在 RR 级别下一定走 Next-Key,行为不一致
  • 事务中执行 SELECT ... FOR UPDATE 后忘了 COMMITROLLBACK,锁会一直挂着,后续 INSERT/UPDATE 可能无限等待,直到锁超时(默认 50 秒)

最复杂也最容易被忽略的一点:Next-Key Lock 的加锁范围高度依赖索引结构和现有数据分布,不是光看 SQL 就能推断出来的;想准确定位,得结合 EXPLAININFORMATION_SCHEMA.INNODB_LOCKS(或 8.0+ 的 performance_schema.data_locks)和实际数据值交叉验证。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

792

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

330

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

350

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

1324

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

363

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

922

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

581

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

425

2024.04.29

go语言 注释编码
go语言 注释编码

本专题整合了go语言注释、注释规范等等内容,阅读专题下面的文章了解更多详细内容。

61

2026.01.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 820人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号