当前位置: 首页 > news >正文

为什么 MySQL InnoDB 的 Repeatable Read 可以阻止幻读?

为什么 MySQL InnoDB 的 Repeatable Read 可以阻止幻读?

首先,幻读(Phantom Read) 指的是:在同一个事务内,前后两次执行相同的查询,第一次查询不到的行,第二次查询时却出现了

例如:

  1. 小明查询 SELECT * FROM users WHERE age > 20,返回 5 条数据。
  2. 小红在另一个事务里插入一条 INSERT INTO users VALUES (21岁用户) 并提交。
  3. 小明再查询,发现结果变成 6 条!这就是幻读。

在标准 SQL 定义下,可重复读(Repeatable Read) 只保证「同一事务内,对已存在的数据读到的内容不变」,但新插入的数据仍然可能影响查询结果,所以一般可重复读不能解决幻读

然而,MySQL 的 InnoDB 通过「间隙锁(Gap Lock)」在可重复读级别下额外解决了幻读问题


InnoDB 如何阻止幻读?—— 间隙锁(Gap Lock)

Gap Lock(间隙锁) 是 InnoDB 的Next-Key Lock 机制的一部分。它不仅锁住「已有的数据行」,还会锁住「数据之间的间隙」,从而防止新的插入。

示例:用间隙锁阻止幻读
  1. 小明启动事务 BEGIN;
  2. 小明执行 SELECT * FROM users WHERE age > 20 FOR UPDATE;
    • InnoDB 发现这里是范围查询,于是加上间隙锁,不仅锁住已有的 age > 20 的用户,还会锁住这些用户之间的「空隙」。
  3. 小红想插入 INSERT INTO users VALUES (21岁用户),但发现被锁住了,必须等小明的事务提交后才能继续。

💡 这样,MySQL InnoDB 通过锁住「数据之间的间隙」,让新的插入无法发生,从而避免了幻读!


总结

  • 标准 SQL 的 Repeatable Read 不能阻止幻读,但 MySQL InnoDB 通过「间隙锁(Gap Lock)」实现了这个能力
  • 间隙锁会锁住「查询范围内的数据 + 数据之间的间隙」,防止新的数据插入,从而避免了「前后两次查询看到的结果不一致」。
  • 但间隙锁可能影响并发性能,因为它会锁住较大的范围,使得插入操作被阻塞。

➡️ 这就是为什么 MySQL InnoDB 的 Repeatable Read 级别下「不会发生幻读」的原因!

相关文章:

  • Django工程获取请求参数的几种方式
  • 一遍通俗易懂的新华三交换机文档指南操作手册
  • AI日报 - 2025年3月10日
  • [项目]基于FreeRTOS的STM32四轴飞行器: 六.2.4g通信
  • ArduPilot开源代码之AP_OSD
  • 基于Python的商品销量的数据分析及推荐系统
  • 使用 Docker 部署 GitLab 并持久化数据
  • comctl32!ListView_OnSetItem函数分析LISTSUBITEM结构中的image表示图标位置
  • 简单的 Python 示例,用于生成电影解说视频的第一人称独白解说文案
  • Oracle数据库监听学习
  • NoteGen是一款开源跨平台的 AI 笔记应用,专注于 recording 和 writing ,基于 Tauri 开发
  • Node.js 技术原理分析系列 4—— 使用 Chrome DevTools 分析 Node.js 性能问题
  • IMX6ULL驱动开发Linux篇02——移植Rootfs
  • 李沐《动手学深度学习》——14.9. 用于预训练BERT的数据集——wiki数据集问题以及存在的其他问题
  • 小白学习:rag向量数据库
  • 《C++ primer》第四章
  • FOC 控制笔记【二】无感控制、滑膜观测器和PLL
  • 用《设计模式》的角度优化 “枚举”
  • Python零基础学习第三天:函数与数据结构
  • PyTorch深度学习在硬件与资源限制下分布式训练和多GPU加速等技术的实例代码
  • 《大风杀》导演张琪:为了不算计观众,拍了部不讨好的警匪片
  • 押井守在30年前创造的虚拟世界何以比当下更超前?
  • 乌总统:若与普京会谈,全面停火和交换战俘是主要议题
  • 阿坝州委书记徐芝文已任四川省政府党组成员
  • 彭丽媛同巴西总统夫人罗桑热拉参观中国国家大剧院
  • 硅料收储挺价“小作文”发酵光伏板块罕见大涨,知情人士:确实在谈