幻读和不可重复读到底有啥区别?
你正在开发一个会议室预定系统。事务 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。idnameage10Alice1020Bob2030Charlie30场景复现 (在 RC 隔离级别下):Session A:开启事务要把所有age 15的用户名字改成 “Senior”。UPDATEusersSETnameSeniorWHEREage15;-- 此时Bob(20) 和 Charlie(30) 的名字被改了。Session B:就在这时突然插入一个新用户 Dave年龄 25。INSERTINTOusers(id,name,age)VALUES(40,Dave,25);-- 在 Read Committed 级别下这是允许的。Session A:提交事务然后再次查询。SELECT*FROMusersWHEREage15;结果Bob (Senior)Charlie (Senior)Dave (Dave)--鬼影出现了后果Session A 明明执行了“把所有大于 15 岁的人改名”结果最后发现竟然漏了一个 Dave。这打破了事务的语义一致性。3. InnoDB 的捉鬼法器Next-Key Lock在标准 SQL 规范中只有SERIALIZABLE (串行化)级别才能解决幻读。但在 MySQL InnoDB 中REPEATABLE READ (可重复读)级别就已经解决了幻读。它是怎么做到的答案是Next-Key Lock。锁的进化史Record Lock (记录锁):只锁住单个记录。例如锁住age20这行。缺陷挡不住别人往age21插数据。Gap Lock (间隙锁):只锁住两个记录之间的空隙开区间不锁记录本身。例如锁住(10, 20)这个区间。作用专门用来防插入Next-Key Lock (临键锁):Record Lock Gap Lock的组合。锁住记录本身同时锁住它前面的空隙左开右闭区间。例如锁住(10, 20]。捉鬼实战 (在 RR 隔离级别下):回到上面的例子当 Session A 执行UPDATE ... WHERE age 15时InnoDB 不仅锁住了现有的行还布下了天罗地网锁住 (10, 20]: 保护 Bob。锁住 (20, 30]: 保护 Charlie。锁住 (30, ∞): 保护无穷大的范围。此时Session B 想要插入age25的 Dave25 落在(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让你“无处可插”修改/加锁查询。

相关新闻

TensorFlow 实现线性回归

TensorFlow 实现线性回归

摘要:本文介绍了使用TensorFlow实现线性回归的基础方法。线性回归通过建立YAxb的线性关系模型,分析预测变量与自变量之间的关系。实现步骤包括:1)导入NumPy和Matplotlib库;2)设置参数生成500个模拟数据点&a…

2026/5/17 4:54:34 阅读更多 →
深入 PyTorch 核心 API:从动态计算图到高性能模型构建

深入 PyTorch 核心 API:从动态计算图到高性能模型构建

深入 PyTorch 核心 API:从动态计算图到高性能模型构建 引言:为什么 PyTorch 成为研究者的首选? PyTorch 自 2016 年问世以来,凭借其直观的接口和动态计算图机制,迅速在深度学习社区中赢得了广泛青睐。与静态图框架相比…

2026/7/3 20:12:48 阅读更多 →
深入解析医疗科技领域 Android 开发工程师职位:技术栈、面试与实战

深入解析医疗科技领域 Android 开发工程师职位:技术栈、面试与实战

中核放射医疗投资有限公司 Android安卓开发工程师 职位信息 主要工作: 1、负责公司产品所需要的Android平台app的的技术架构,开发及维护。 2、完成Android端的相关产品及模块的设计、开发及优化。 3、参与Android平台相关产品框架的规划、设计和改进及产品重构99作。 4、参与…

2026/7/3 1:37:34 阅读更多 →

最新新闻

相机、激光雷达与事件相机动态感知原理对比

相机、激光雷达与事件相机动态感知原理对比

1. 项目概述:为什么“动态感知”成了自动驾驶与机器人领域的生死线?你有没有注意过,一辆车在暴雨中急刹时,传统摄像头拍到的画面几乎是一片模糊的水幕,而激光雷达却能稳稳锁定前方突然窜出的电动车轮廓;又或…

2026/7/3 20:09:12 阅读更多 →
DreamScene2:免费开源Windows动态桌面终极解决方案

DreamScene2:免费开源Windows动态桌面终极解决方案

DreamScene2:免费开源Windows动态桌面终极解决方案 【免费下载链接】DreamScene2 一个小而快并且功能强大的 Windows 动态桌面软件 项目地址: https://gitcode.com/gh_mirrors/dr/DreamScene2 厌倦了千篇一律的静态壁纸?想要让Windows桌面焕发新生…

2026/7/3 20:09:12 阅读更多 →
2026年IEEE第九届机器学习和自然语言处理国际会议 (MLNLP 2026)

2026年IEEE第九届机器学习和自然语言处理国际会议 (MLNLP 2026)

【重要信息】 大会时间:2026年12月26-28日 大会地点:中国-厦门 检索类型:EI核心,Scopus及CPCI-S 出版社:IEEE出版社 主办单位:集美大学 承办单位:集美大学计算机工程学院 【征稿主题】: 专题一&…

2026/7/3 20:07:11 阅读更多 →
Selenium、Cypress与Playwright:现代Web自动化测试框架深度对比与选型指南

Selenium、Cypress与Playwright:现代Web自动化测试框架深度对比与选型指南

1. 项目概述:自动化测试框架的“三国演义” 在Web应用开发与质量保障的战场上,自动化测试框架的选择,往往是决定团队效率与测试稳定性的关键一步。最近几年,围绕Selenium、Cypress和Playwright的讨论就没停过,几乎每个…

2026/7/3 20:05:11 阅读更多 →
AI生成代码上线后崩溃?3个被90%团队忽略的生产环境验证环节,漏一个就埋雷

AI生成代码上线后崩溃?3个被90%团队忽略的生产环境验证环节,漏一个就埋雷

更多请点击: https://kaifayun.com 第一章:AI生成代码上线后崩溃?3个被90%团队忽略的生产环境验证环节,漏一个就埋雷 AI生成的代码在开发环境跑通,不等于能在生产环境稳定运行。大量团队将LLM输出的代码直接集成进CI/…

2026/7/3 20:03:10 阅读更多 →
告别运维黑盒:Semaphore如何让基础设施管理变得像操作手机应用一样简单

告别运维黑盒:Semaphore如何让基础设施管理变得像操作手机应用一样简单

告别运维黑盒:Semaphore如何让基础设施管理变得像操作手机应用一样简单 【免费下载链接】semaphore Modern UI and powerful API for Ansible, Terraform/OpenTofu/Terragrunt, PowerShell and other DevOps tools. 项目地址: https://gitcode.com/gh_mirrors/se/…

2026/7/3 20:03:10 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻