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扩展包开发入门到发布