news 2026/4/16 9:08:11

可重复读(Repeatable Read)隔离级别下幻读产生的原因

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
可重复读(Repeatable Read)隔离级别下幻读产生的原因

幻读(Phantom Read)是指在一个事务中,两次相同的范围查询返回了不同数量的行,主要由于其他事务插入新行导致。

产生幻读的核心原因:

1.快照读 vs 当前读的混合使用
-- 可重复读下,普通SELECT是快照读,基于MVCC版本链 SELECT * FROM users WHERE age > 20; -- 快照读,使用事务开始时的快照 -- 但某些操作会触发当前读 UPDATE users SET status = 1 WHERE age > 20; -- 当前读,看到最新提交的数据 SELECT * FROM users WHERE age > 20 FOR UPDATE; -- 当前读,加锁
2.MVCC的局限性
  • MVCC保证已存在的行读取一致性

  • 但无法阻止其他事务插入新的行

  • 事务开始时创建ReadView,只记录当时已存在的行版本

3.锁机制的缺失

在标准SQL规范中,可重复读级别:

  • 只对已存在的行加锁(行锁)

  • 不对不存在的行(间隙)加锁

  • 因此其他事务可以插入满足条件的新行

实际示例:

-- 事务A START TRANSACTION; -- 第一次查询:返回id为1,2,3的3条记录 SELECT * FROM users WHERE id BETWEEN 1 AND 5; -- 此时事务B插入id=4的新记录并提交 INSERT INTO users(id, name) VALUES (4, 'new_user'); COMMIT; -- 事务A再次查询(可重复读应返回相同3条记录) SELECT * FROM users WHERE id BETWEEN 1 AND 5; -- 仍然只看到id 1,2,3 -- 但事务A执行更新操作时 UPDATE users SET status = 1 WHERE id BETWEEN 1 AND 5; -- 更新会作用到id=4的行(因为更新是当前读) -- 然后事务A再次查询,就会看到4条记录 ← 这就是幻读

MySQL InnoDB的特殊处理

MySQL通过Next-Key Locking机制在可重复读级别避免了幻读:

SELECT * FROM users WHERE age > 20 FOR UPDATE; -- InnoDB会锁住age>20的整个范围(间隙锁+行锁) -- 其他事务无法插入age>20的新行

总结表格:

隔离级别脏读不可重复读幻读
读未提交
读已提交
可重复读可能发生
串行化

关键点

  • 幻读专指新插入的行

  • 可重复读能防止已存在行的修改,但不能防止新行的插入

  • 实际应用中可通过SELECT ... FOR UPDATE加间隙锁来避免

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 8:16:24

现在大厂的AI产品经理在做什么?怎么分类

国庆假期,一些大厂的产品经理回到了成都,线下面基了几个朋友,在聊到现在大厂的AI产品经理工作内容,我们不妨围绕着内容、以及分类做了探讨。 我认为还是有一些借鉴意义,尤其是那些对打算去大厂的朋友来说,了…

作者头像 李华
网站建设 2026/4/13 22:20:32

AI产品经理从小白到高薪专家的完整路径,3步掌握未来最吃香岗位

AI产品经理是未来最具前景的职业,分为工具型、应用型和专业型三个层次。对于大多数人,应用型AI产品经理是最佳选择。通过夯实产品基本功、掌握AI项目落地能力和补充AI知识技能三步,可系统成长为AI产品经理。起点课堂全站通会员提供完整学习路…

作者头像 李华
网站建设 2026/4/14 3:07:05

大模型岗位薪资爆了,年薪百万轻轻松松,非常详细收藏我这一篇就够了

2024下半年,“大模型狂热”愈演愈烈 国内巨头战队华为、百度、阿里在AIGC的厮杀中 从通用大模型渗透到各垂类应用市场 就连创投资本也独宠AIGC企业 百度、科大讯飞市值分别增加27亿和45亿美元 这导致AI人才缺口大、薪资普遍上涨↑40% 不少企业开出百万年薪挖掘大模型…

作者头像 李华
网站建设 2026/4/14 0:33:27

Node.js用esbuild加速模块编译

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 Node.js模块编译加速:esbuild如何重塑开发体验目录Node.js模块编译加速:esbuild如何重塑开发体验 引言&a…

作者头像 李华
网站建设 2026/4/15 18:26:33

双曲余弦ch(x)双曲余弦函数(ch(x))是双曲函数的一种,定义为:‌ch(x) = (eˣ + e⁻ˣ) / 2‌它和三角函数中的余弦函数类似,但定义在双曲线上,常用于数学、物理和工程领

双曲余弦ch(x) 双曲余弦函数(ch(x))是双曲函数的一种,定义为: ‌ch(x) = (eˣ + e⁻ˣ) / 2‌ 它和三角函数中的余弦函数类似,但定义在双曲线上,常用于数学、物理和工程领域。 主要性质 ‌定义域‌:全体实数(x ∈ ℝ) ‌值域‌:[1, +∞) ‌奇偶性‌:偶函数(ch(…

作者头像 李华