SQL数据库间隙锁原理_防止幻读实现机制
发布时间 - 2026-01-09 00:00:00 点击率:次间隙锁锁定索引中相邻值之间的开区间(a,b),如(−∞,10)、(10,20)等,防止其他事务在该范围插入新记录;InnoDB通过临键锁(行锁+前向间隙锁)实现可重复读下的幻读防控。
间隙锁是InnoDB在可重复读(RR)隔离级别下防止幻读的核心机制,它不锁记录本身,而是锁定索引中两个相邻值之间的“空档”——也就是尚未存在的数据插入位置。
间隙锁锁的是什么范围
间隙锁作用于索引的有序结构,锁定的是开区间(a, b),即所有严格大于a、严格小于b的值。例如索引值为[10, 20, 30]时,存在的间隙包括:
- (−∞, 10)
- (10, 20)
- (20, 30)
- (30, +∞)
这些区间代表可能插入新记录的位置。间隙锁生效后,其他事务无法向其中插入满足条
件的新行,比如在(10, 20)中插入id=15的记录就会被阻塞。
间隙锁如何配合行锁防止幻读
单独的行锁只能保护已有数据不被修改或删除,但对“新增”无能为力。InnoDB实际使用的是临键锁(Next-Key Lock),它是行锁与前向间隙锁的组合,形式为(a, b]——左开右闭。
- 查询 SELECT ... WHERE age BETWEEN 25 AND 35 FOR UPDATE 时,若当前有age=25、30、35三条记录,则不仅锁定这三行,还会锁定(−∞,25)、(25,30)、(30,35)、(35,+∞)中的相关间隙
- 重点在于:它把查询条件覆盖的整个索引范围都纳入保护,使其他事务无法在该范围内插入任何符合WHERE条件的新记录
- 这样事务内两次相同范围的当前读(如FOR UPDATE),结果集就始终一致,幻读自然消失
间隙锁只在特定操作中激活
它不是默认开启的全局锁,而是在满足以下条件时由InnoDB自动加锁:
- 事务隔离级别为可重复读(RR)或串行化(SERIALIZABLE)
- 执行的是当前读操作,包括 SELECT ... FOR UPDATE、SELECT ... IN SHARE MODE、UPDATE、DELETE
- 查询条件含范围谓词(如 >、
- 对应索引列存在有效索引,否则退化为表级锁或无法精确锁定间隙
快照读和当前读的区别决定是否依赖间隙锁
MySQL通过两种路径应对幻读:
- 快照读(普通SELECT):靠MVCC机制,读取事务启动时刻的ReadView,看到的是历史一致性视图,插入的新行对它不可见,无需间隙锁
- 当前读(带锁SELECT/UPDATE/DELETE):必须看到最新数据,因此需要间隙锁+行锁协同,确保读到的数据范围在事务期间稳定不变
换句话说,间隙锁是为“要改、要锁、要实时”的场景服务的,不是为所有查询兜底。
# mysql
# 区别
# sql
# for
# select
# delete
# 数据库
# 的是
# 前向
# 就会
# 是在
# 已有
# 还会
# 两种
# 两次
# 它是
# 使其
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
怎么用AI帮你设计一套个性化的手机App图标?
Win11怎么关闭透明效果_Windows11辅助功能视觉效果设置
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
如何用5美元大硬盘VPS安全高效搭建个人网站?
什么是javascript作用域_全局和局部作用域有什么区别?
node.js报错:Cannot find module 'ejs'的解决办法
,交易猫的商品怎么发布到网站上去?
简历在线制作网站免费版,如何创建个人简历?
Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】
LinuxCD持续部署教程_自动发布与回滚机制
Laravel软删除怎么实现_Laravel Eloquent SoftDeletes功能使用教程
三星、SK海力士获美批准:可向中国出口芯片制造设备
香港服务器网站卡顿?如何解决网络延迟与负载问题?
Internet Explorer官网直接进入 IE浏览器在线体验版网址
js实现获取鼠标当前的位置
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
JS弹性运动实现方法分析
高端企业智能建站程序:SEO优化与响应式模板定制开发
如何在IIS中新建站点并配置端口与IP地址?
高防服务器租用首荐平台,企业级优惠套餐快速部署
java中使用zxing批量生成二维码立牌
Laravel怎么发送邮件_Laravel Mail类SMTP配置教程
Laravel PHP版本要求一览_Laravel各版本环境要求对照
Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出
厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?
iOS发送验证码倒计时应用
如何用y主机助手快速搭建网站?
Laravel如何使用Spatie Media Library_Laravel图片上传管理与缩略图生成【步骤】
Thinkphp 中 distinct 的用法解析
Laravel中间件如何使用_Laravel自定义中间件实现权限控制
怎么用AI帮你为初创公司进行市场定位分析?
香港网站服务器数量如何影响SEO优化效果?
Laravel怎么实现模型属性转换Casting_Laravel自动将JSON字段转为数组【技巧】
Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
laravel怎么配置和使用PHP-FPM来优化性能_laravel PHP-FPM配置与性能优化方法
如何用搬瓦工VPS快速搭建个人网站?
百度浏览器网页无法复制文字怎么办 百度浏览器复制修复
JavaScript如何实现错误处理_try...catch如何捕获异常?
微信h5制作网站有哪些,免费微信H5页面制作工具?
PHP 实现电台节目表的智能时间匹配与今日/明日轮播逻辑
南京网站制作费用,南京远驱官方网站?
HTML5空格和margin有啥区别_空格与外边距的使用场景【说明】
javascript基本数据类型及类型检测常用方法小结
夸克浏览器网页跳转延迟怎么办 夸克浏览器跳转优化
微信小程序 scroll-view组件实现列表页实例代码
Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】
Laravel如何理解并使用服务容器(Service Container)_Laravel依赖注入与容器绑定说明
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布

