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

幻读和不可重复读到底有啥区别?


你正在开发一个会议室预定系统。
事务 A:查询 10:00 - 11:00 有没有空闲的会议室?(SELECT * FROM rooms WHERE status = 'FREE')。结果显示:没有。
事务 B:此时,另一个管理员插入了一条新记录:10:00 - 11:00 的“Room A”是空闲的。
事务 A:再次查询(或者准备插入一条冲突记录时),突然发现——怎么多出来一个空闲会议室?
灵异现象:
刚才明明检查过“没有”,转眼间又“有”了。你以为自己看花眼了,其实是撞上了数据库的幻读


1. 核心定义:幻读 vs 不可重复读

这是面试和实战中最容易混淆的概念。

  • 不可重复读 (Non-Repeatable Read):

  • 重点在修改 (UPDATE) 或 删除 (DELETE)

  • 场景:第一次查是 100 块钱,第二次查变成 0 块钱了(被别人改了)。

  • 锁定策略:锁住这一行记录即可解决。

  • 幻读 (Phantom Read):

  • 重点在插入 (INSERT)

  • 场景:第一次查有 3 行记录,第二次查变成了 4 行记录(被别人插进来了)。

  • 锁定策略:光锁住现有的行没用,因为新数据是“无中生有”的。你必须锁住行之间的空隙 (Gap)


2. 实战演练:幻读是如何发生的?

假设我们有一张简单的表users,有索引age

idnameage
10Alice10
20Bob20
30Charlie30
场景复现 (在 RC 隔离级别下):
  1. Session A:开启事务,要把所有age > 15的用户名字改成 “Senior”。
UPDATEusersSETname='Senior'WHEREage>15;-- 此时,Bob(20) 和 Charlie(30) 的名字被改了。
  1. Session B:就在这时,突然插入一个新用户 Dave,年龄 25。
INSERTINTOusers(id,name,age)VALUES(40,'Dave',25);-- 在 Read Committed 级别下,这是允许的。
  1. Session A:提交事务,然后再次查询。
SELECT*FROMusersWHEREage>15;

结果:

  • Bob (Senior)
  • Charlie (Senior)
  • Dave (Dave)<--鬼影出现了!

后果:Session A 明明执行了“把所有大于 15 岁的人改名”,结果最后发现竟然漏了一个 Dave。这打破了事务的语义一致性。


3. InnoDB 的捉鬼法器:Next-Key Lock

在标准 SQL 规范中,只有SERIALIZABLE (串行化)级别才能解决幻读。但在 MySQL InnoDB 中,REPEATABLE READ (可重复读)级别就已经解决了幻读。

它是怎么做到的?答案是Next-Key Lock

锁的进化史:
  1. Record Lock (记录锁):
  • 只锁住单个记录
  • 例如:锁住age=20这行。
  • 缺陷:挡不住别人往age=21插数据。
  1. Gap Lock (间隙锁):
  • 只锁住两个记录之间的空隙(开区间),不锁记录本身。
  • 例如:锁住(10, 20)这个区间。
  • 作用:专门用来防插入!
  1. Next-Key Lock (临键锁):
  • Record Lock + Gap Lock的组合。
  • 锁住记录本身,同时锁住它前面的空隙(左开右闭区间)。
  • 例如:锁住(10, 20]
捉鬼实战 (在 RR 隔离级别下):

回到上面的例子,当 Session A 执行UPDATE ... WHERE age > 15时,InnoDB 不仅锁住了现有的行,还布下了天罗地网

  1. 锁住 (10, 20]: 保护 Bob。
  2. 锁住 (20, 30]: 保护 Charlie。
  3. 锁住 (30, +∞): 保护无穷大的范围。

此时,Session B 想要插入age=25的 Dave:

  • 25 落在(20, 30]的范围内。
  • 结果:Session B 被阻塞 (Blocked),直到 Session A 提交。

结论:Next-Key Lock 通过锁住“可能插入数据的位置”,彻底扼杀了幻读。


4. 特殊情况:快照读 vs 当前读

这里有一个面试深坑。

InnoDB 在 RR 级别下,解决幻读有两种方式,取决于你的 SQL 写法:

情况 A:快照读 (Snapshot Read)
  • SQL:SELECT * FROM table WHERE ...(普通的查询)
  • 机制:MVCC (多版本并发控制)
  • 原理:事务启动时拍了一张照片。不管别人怎么插入,我只看照片里的数据。
  • 效果:彻底看不到幻读,新插入的数据对我不可见。
情况 B:当前读 (Current Read)
  • SQL:SELECT ... FOR UPDATE,UPDATE,DELETE,INSERT
  • 机制:Next-Key Lock
  • 原理:我要读取最新的数据,并且要加锁。为了防止我读完后别人插入,我必须把间隙锁死。
  • 效果:强制阻塞插入操作,物理上杜绝幻读。

5. 总结

幻读 (Phantom Read)是并发事务中最高级的 Boss。

  • 现象:同样条件的查询,多出来了新行。
  • 原因:INSERT操作改变了数据总量。
  • 解法:
  • MVCC让你“视而不见”(普通查询)。
  • Next-Key Lock让你“无处可插”(修改/加锁查询)。
http://www.jsqmd.com/news/383629/

相关文章:

  • LabVIEW模糊逻辑颜色偏好训练系统
  • LabVIEW断路器机械故障诊断
  • 观感需求类型之一
  • 如何选择适合自己的单招机构?唐山考生专属攻略来了 - 品牌排行榜单
  • 在唐山,单招机构应该怎么选?掌握这几个维度不踩雷 - 品牌排行榜单
  • 唐山找单招学校如何避坑?这些实用技巧帮你绕开弯路 - 品牌排行榜单
  • 【面向LLM的企业级架构设计】
  • TensorFlow 实现线性回归
  • 2026年靠谱的口香糖铁盒/糖果铁盒畅销厂家采购指南如何选 - 品牌宣传支持者
  • 手机就是你的AI实验室:AutoGLM开源实战,用智谱GLM-4.7控制手机完成自动打卡
  • 从基础到实战:Java全栈工程师的面试之旅
  • 2026年初湖南保洁外包企业综合评估与精选推荐 - 2026年企业推荐榜
  • 2026年成都石膏板供货商综合评估:谁在驱动品质与效率革命? - 2026年企业推荐榜
  • 2026年如何选择优秀的候车亭生产厂家 - 2026年企业推荐榜
  • 2026年江苏双轮深搅品牌五强深度解析与选型指南 - 2026年企业推荐榜
  • 2026年湖南物业保洁服务商综合评测与选型指南 - 2026年企业推荐榜
  • AI如何让生产线“活”起来,从容应对多品种小批量挑战? - 智慧园区
  • ​ ⛳️赠与读者[特殊字符]1 概述一、风光储互补微电网的基本概念与组成结构风光储互补微电网是一种集成风力发电、光伏发电和储能系统的自治电力系统,通过多能源协同与能量管理,实现供电稳定性、
  • 2026年特氟龙喷涂实力厂商综合测评与前瞻指南 - 2026年企业推荐榜
  • 2026开年:DeepSeek关键词优化服务商五强榜单深度解析 - 2026年企业推荐榜
  • 深入 PyTorch 核心 API:从动态计算图到高性能模型构建
  • 2026年四川钻石全能高基板优质供货商盘点与推荐 - 2026年企业推荐榜
  • 带隙基准参考电压源的温度特性 LTspice仿真结果
  • 2026江苏多向模锻液压机五强盘点:技术、服务与生态的较量 - 2026年企业推荐榜
  • 2026年江苏蒸汽压缩机市场分析与可靠服务商选购指南 - 2026年企业推荐榜
  • 2026江苏公交站台厂家综合实力TOP5推荐 - 2026年企业推荐榜
  • 2026年特种绳带生产商选型指南:技术、服务与全球视野 - 2026年企业推荐榜
  • 2026年知识产权规划服务商综合评测与选型指南 - 2026年企业推荐榜
  • Android 软件开发工程师:核心能力解析与深度技术面面观
  • 捐款历史-2020