登录
/
注册
首页
论坛
其它
首页
科技
业界
安全
程序
广播
Follow
关于
导读
排行榜
资讯
发帖说明
登录
/
注册
账号
自动登录
找回密码
密码
登录
立即注册
搜索
搜索
关闭
CSDN热搜
程序园
精品问答
技术交流
资源下载
本版
帖子
用户
软件
问答
教程
代码
写记录
写博客
小组
VIP申请
VIP网盘
网盘
联系我们
发帖说明
道具
勋章
任务
淘帖
动态
分享
留言板
导读
设置
我的收藏
退出
腾讯QQ
微信登录
返回列表
首页
›
业界区
›
安全
›
MySQL 通过 Next-Key Locking 技术(行锁+间隙锁)避免 ...
MySQL 通过 Next-Key Locking 技术(行锁+间隙锁)避免幻读问题
[ 复制链接 ]
焦和玉
2025-6-10 15:44:44
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
在MySQL中,InnoDB引擎通过
Next-Key Locking
技术来解决幻读问题。幻读是一种事务并发问题,通常出现在Repeatable Read隔离级别下的范围查询操作中。幻读的现象是,事务在查询时多次执行相同的范围查询,但由于其他事务的插入或删除操作导致结果不一致,出现“幻觉”一样的记录。
Next-Key Locking
技术结合了
行锁(Record Lock)
和
间隙锁(Gap Lock)
,通过锁定范围内的记录和它们之间的间隙,防止其他事务在这些锁定的区域内插入或删除数据,从而避免了幻读问题。
一、什么是Next-Key Locking?
Next-Key Locking 是一种
锁定区间
的机制,它由两部分组成:
行锁(Record Lock)
:锁定精确的一行数据,防止其他事务对该行数据的修改。
间隙锁(Gap Lock)
:锁定一行数据之间的“间隙”,防止其他事务在该间隙中插入新数据。
Next-Key Locking 锁住了当前查询的行及其“前后”的间隙,这样不仅可以防止已有记录的修改,还能防止在查询范围内插入新数据,避免了幻读问题。
二、Next-Key Locking 的原理
在Repeatable Read隔离级别下,当执行范围查询时,InnoDB会通过Next-Key Locking在范围内锁定所有满足条件的行及其相邻的间隙。例如,执行下面的SQL语句:
SELECT * FROM users WHERE age BETWEEN 20 AND 30 FOR UPDATE;
复制代码
这个查询会锁定users表中所有满足age BETWEEN 20 AND 30的行,以及每一行数据之间的“间隙”。具体锁定机制如下:
行锁(Record Lock)
:锁定所有符合条件的行,阻止其他事务修改这些行。
间隙锁(Gap Lock)
:锁定查询范围内的行之间的“间隙”,阻止其他事务在这些间隙中插入新行。
假设当前数据如下:
id | age
---------
1 | 18
2 | 25
3 | 28
4 | 35
复制代码
执行 SELECT * FROM users WHERE age BETWEEN 20 AND 30 FOR UPDATE; 时,Next-Key Locking 会做如下操作:
锁住 age=25 和 age=28 这两行(Record Lock)。
锁住age > 18 到 age < 35 之间的所有间隙(Gap Lock),即阻止在 age=19 到 age=34 之间插入新行。
这保证了在当前事务提交之前,其他事务无法在查询的范围内插入、删除或修改数据,从而避免了幻读。
三、Next-Key Locking 的实现机制
Record Lock(行锁)
:行锁是一种精确的锁,它只会锁定某个特定的行,防止其他事务修改该行数据。行锁可以确保事务中的读写操作对已经存在的数据行保持一致。
Gap Lock(间隙锁)
:间隙锁是一种范围锁,它锁定数据行之间的间隙。它不会锁定实际的数据行,而是锁定行之间的空隙,防止其他事务在这些空隙中插入新的记录。这种锁用来解决幻读问题。
Next-Key Locking(行锁 + 间隙锁)
:Next-Key Locking 结合了行锁和间隙锁,它不仅锁住了精确的数据行,还锁住了数据行之间的间隙。这样,Next-Key Locking 能有效防止其他事务在当前查询的范围内插入新数据,从而避免幻读。
四、Next-Key Locking 解决幻读的过程
Next-Key Locking 是在Repeatable Read隔离级别中使用的,流程大致如下:
事务A
执行一个范围查询,例如SELECT * FROM users WHERE age BETWEEN 20 AND 30 FOR UPDATE;。此时,InnoDB 会使用 Next-Key Locking 锁住范围内的数据行和间隙,阻止其他事务在该范围内插入新的记录。
事务B
尝试在age=26的位置插入一条新记录。由于事务A已经通过Next-Key Locking锁住了age=25到age=30之间的间隙,事务B将被阻塞,直到事务A提交或回滚。
事务A
提交或回滚后,事务B才能成功插入数据。如果事务A没有锁定这个范围,事务B插入数据后,事务A再进行范围查询时,结果就会不同,导致幻读的产生。
通过这种方式,Next-Key Locking 解决了由于并发插入导致的幻读问题。
五、Next-Key Locking 的优势与限制
优势
:
解决幻读问题
:Next-Key Locking 能有效防止在范围查询时产生幻读,保证事务的一致性。
增强数据安全性
:锁住查询范围内的间隙,防止其他事务在未提交的情况下对数据进行插入或修改,保证事务中的数据一致性。
限制
:
降低并发性能
:Next-Key Locking 的锁粒度较大,可能会锁定大量的行和间隙,导致系统的并发性能下降。
间隙锁的开销
:间隙锁会导致无法插入数据到锁定范围内的空隙中,这在某些场景下可能影响数据写入效率,尤其是在高并发写入的场景。
六、Next-Key Locking 的实际使用场景
银行系统中的余额查询
:
在银行系统中,用户查询账户余额时可能会执行范围查询(例如,查询特定时间段的交易记录)。通过Next-Key Locking,系统可以防止其他事务在这个时间段内插入新的交易记录,确保用户每次查询得到的一致结果。
电商系统中的订单查询
:
在电商平台中,用户查询某一时间段的订单时,可能需要保证查询过程中订单数据的一致性。通过Next-Key Locking,避免其他用户在订单查询期间插入新的订单,确保订单数据的一致性。
七、总结
Next-Key Locking
通过将行锁和间隙锁结合起来,解决了MySQL中Repeatable Read隔离级别下的幻读问题。它不仅锁住了查询范围内的具体数据行,还锁住了数据行之间的空隙,防止了新数据的插入。虽然这种锁机制能有效解决并发环境下的数据一致性问题,但也会带来并发性能的下降,需要在实际业务场景中权衡使用。
看了那么久别人写的内容,自己整理,总结归纳一下。言简意赅
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
MySQL
通过
Next
Key
Locking
相关帖子
MySQL 从入门到删库跑路,保姆级教程!
如何通过无代码平台构建高效智能体 — AgenticHub的革命性创新
AlmaLinux下mysql 8安装与数据迁移
Ubuntu下,MySQL密码遗失时修改密码
Ubuntu下,MySQL修改端口号
MySQL 筛选条件放 ON 后 vs 放 WHERE 后
Antd 在 Next.js 项目中,初次渲染样式丢失
通过.ovf和.vmdk导入VMware虚拟机
记一次MySQL binlog日志导致磁盘空间占满的问题
记一次MySQL binlog日志导致磁盘空间占满的问题
回复
使用道具
举报
提升卡
置顶卡
沉默卡
喧嚣卡
变色卡
千斤顶
照妖镜
相关推荐
业界
MySQL 从入门到删库跑路,保姆级教程!
0
782
都淑贞
2025-12-02
安全
如何通过无代码平台构建高效智能体 — AgenticHub的革命性创新
1
644
搜娲瘠
2025-12-05
安全
AlmaLinux下mysql 8安装与数据迁移
1
338
菅舛
2025-12-07
安全
Ubuntu下,MySQL密码遗失时修改密码
1
863
徙办
2025-12-07
安全
Ubuntu下,MySQL修改端口号
2
118
痨砖
2025-12-07
安全
MySQL 筛选条件放 ON 后 vs 放 WHERE 后
1
954
热琢
2025-12-10
业界
Antd 在 Next.js 项目中,初次渲染样式丢失
0
38
馑妣窟
2025-12-15
业界
通过.ovf和.vmdk导入VMware虚拟机
0
711
涣爹卮
2025-12-17
安全
记一次MySQL binlog日志导致磁盘空间占满的问题
0
884
荆邦
2025-12-17
安全
记一次MySQL binlog日志导致磁盘空间占满的问题
0
784
跟尴
2025-12-17
回复
(4)
琉艺戕
2025-10-18 00:45:29
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
这个有用。
瞪皱炕
2025-10-30 13:39:23
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
过来提前占个楼
闻成
2025-11-20 15:26:54
回复
使用道具
举报
照妖镜
程序园永久vip申请,500美金$,无限下载程序园所有程序/软件/数据/等
感谢分享,下载保存了,貌似很强大
何书艺
2025-11-30 16:50:49
回复
使用道具
举报
照妖镜
猛犸象科技工作室:
网站开发,备案域名,渗透,服务器出租,DDOS/CC攻击,TG加粉引流
懂技术并乐意极积无私分享的人越来越少。珍惜
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
回复
本版积分规则
回帖并转播
回帖后跳转到最后一页
签约作者
程序园优秀签约作者
发帖
焦和玉
2025-11-30 16:50:49
关注
0
粉丝关注
21
主题发布
板块介绍填写区域,请于后台编辑
财富榜{圆}
3934307807
991124
anyue1937
9994893
kk14977
6845358
4
xiangqian
638210
5
韶又彤
9997
6
宋子
9982
7
闰咄阅
9993
8
刎唇
9993
9
俞瑛瑶
9998
10
蓬森莉
9951
查看更多
今日好文热榜
976
生成式引擎优化(GEO优化)全维度技术指南
541
GEO优化实战指南2025:六大服务商核心能力
756
原始类型与泛型对比笔记
680
印度股票数据 API 对接实战指南(含实时行
656
Apipost分支功能:为API开发打造专属的成本
327
OpenCVSharp:学习人脸检测例子
548
JSAPIThree 加载单体三维模型学习笔记:Sim
123
读捍卫隐私09匿名指南
72
工作中常用函数详解与示例-PostgreSQL(其他
589
很顶!零成本克隆你的声音,这款B站开源神
679
go语言/golang 自动升级配置
965
函数式编程与传统编程的对比——基于java
232
pgAdmin 后台命令执行漏洞复现及分析(CVE-
857
度假村亲子水上乐园设备哪家质量好?
286
上下文协议(MCP)Java SDK 指南
699
Mac办公效率翻倍?Charmstone教你玩转多任
774
深耕上海14年,专业防水补漏:如何为厂房、
827
【A】字符串
465
一个完全由大模型AI Coding开发而成的程序
701
【Ubuntu】Ubuntu+VScode+ESP-IDF 的环境搭