MVCC、幻读、间隙锁与临键锁

news/2025/10/16 7:00:44/文章来源:https://www.cnblogs.com/jelly12345/p/19144682

一、MVCC 解决了什么问题?

🌱 背景:并发读写冲突

当多个事务同时操作同一行时,最经典的冲突是:

  • A 在读;

  • B 在写;

  • A 还没提交,B 改了数据;

  • 如何让 A 看到一致的结果?

MVCC(Multi-Version Concurrency Control,多版本并发控制)
👉 解决的核心问题是:

✅ 在高并发环境下,读写不阻塞,并且保证事务隔离一致性(尤其是可重复读 / Repeatable Read)。

也就是说,MVCC 让:

  • “读操作”不用加锁就能读到事务一致视图;

  • “写操作”也能正常进行,不会阻塞读;

  • 事务之间看到的数据是一致的(基于事务启动时的快照)。


二、MySQL 幻读解决了吗?

要看事务隔离级别读类型

读类型读已提交 (RC)可重复读 (RR)说明
普通快照读 (SELECT …) ✅ 幻读存在 ✅ 已解决 RR 下 MVCC + 间隙锁配合消除幻读
当前读 (SELECT … FOR UPDATE / UPDATE / DELETE) ✅ 幻读存在 ✅ 已解决 RR 下间隙锁和临键锁阻止插入

✅ 结论:

可重复读(RR) 隔离级别下,InnoDB 已经彻底解决了幻读问题。


三、MVCC 的实现原理(核心机制)

InnoDB 通过 隐藏列 + Undo Log + Read View 三个机制实现多版本并发控制。

1️⃣ 隐藏列(3个)

每行数据除了用户字段外,InnoDB 内部维护三个隐藏列:

  • DB_TRX_ID:最后修改该行的事务 ID。

  • DB_ROLL_PTR:指向 undo log 的指针(用于找到旧版本)。

  • DB_ROW_ID:行的自增主键(非显式主键时存在)。


2️⃣ Undo Log(版本链)

每当事务修改一行数据时:

  • 不直接覆盖,而是把旧值写入 undo log

  • 并在当前行的 DB_ROLL_PTR 指向该 undo log;

  • 从而形成一个“版本链”:

 
最新行 (trx_id=100) → undo_log_99 → undo_log_80 → ...

每个版本都有自己的事务 ID。


3️⃣ Read View(读视图)

当事务执行第一个一致性读时(例如 SELECT),InnoDB 会生成一个 Read View,记录以下信息:

字段含义
m_ids 当前系统中活跃事务的 ID 列表
min_trx_id 当前活跃事务中最小的事务 ID
max_trx_id 当前还未分配的下一个事务 ID(上限)
creator_trx_id 当前事务自身 ID

4️⃣ MVCC 读版本规则(判断可见性)

InnoDB 判断一行是否对当前事务可见,遵循如下规则:

设该行版本的 trx_id = X

条件是否可见
X < min_trx_id ✅ 已提交的旧事务,数据可见
X ∈ m_ids ❌ 正在执行的事务,不可见
X > max_trx_id ❌ 新事务创建的数据,不可见

如果该版本不可见,就顺着 undo log 找上一个版本,直到找到可见版本。

👉 这就是“多版本”:读事务读的是自己快照中可见版本的链


四、幻读问题 & 间隙锁 / 临键锁如何解决

1️⃣ 什么是幻读

幻读:事务 A 重复执行相同的查询,却发现多了(或少了)几行记录。

例:

 
-- 事务A SELECT * FROM user WHERE age > 18; -- 查询到10条 -- 事务B INSERT INTO user(age=20); -- 事务A 再次执行同样查询,发现11条 -> 幻读

2️⃣ MVCC 能防幻读吗?

👉 只对已存在的行有效;
但是对新插入的行(不存在的版本链)无能为力。
所以要用锁机制配合。


3️⃣ 间隙锁(Gap Lock)

作用于“记录之间的空隙”,阻止其他事务在间隙内插入数据。

例:

 
SELECT * FROM user WHERE age > 18 FOR UPDATE;

假设表中有 age=10, 20, 30
事务 A 会锁定:

 
(10,20), (20,30), (30, +∞)

→ 其他事务不能在这些区间插入新的行。

📌 解决了“幻读”的核心问题:

防止别的事务在当前事务扫描范围内插入新数据。


4️⃣ 临键锁(Next-Key Lock)

记录锁(Record Lock) + 间隙锁(Gap Lock) 的组合。
锁定“当前行 + 前一个间隙”。

例如:

 
SELECT * FROM user WHERE age = 20 FOR UPDATE;

假设有行 (age=20),临键锁会锁定区间 (10,20]

📌 优势:

  • 保证唯一性;

  • 避免插入相同主键;

  • 避免幻读(锁定扫描范围内的间隙)。


五、例子总结:快照读 vs 当前读

场景使用方式锁类型是否受MVCC影响是否防幻读
快照读 SELECT ... 无锁 ✅ 是 ✅ RR 下已解决
当前读 SELECT ... FOR UPDATEUPDATEDELETE 临键锁 / 间隙锁 ❌ 否 ✅ 防止插入幻读

六、总结对比表

机制解决问题原理是否加锁是否防幻读
MVCC 读写并发、可重复读 undo log + Read View ✅(快照读)
间隙锁 防止插入幻读 锁定记录间隙
临键锁 防止幻读 + 保证唯一性 记录锁 + 间隙锁

一句话总结:

MVCC 让读写不互斥(靠版本链解决读一致性);
间隙锁 & 临键锁让写不产生幻读(靠锁定范围防插入)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/937958.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MVCC、幻读、间隙锁与临键锁(二)

1. MVCC 解决了什么问题? MVCC(多版本并发控制)是 MySQL InnoDB 存储引擎实现并发访问的核心机制,主要解决了读写冲突问题:在传统锁机制中,读操作需要加共享锁,写操作需要加排他锁,会导致 “读阻塞写、写阻塞读…

读AI赋能01超级能动性

读AI赋能01超级能动性1. 超级能动性 1.1. 通货膨胀已成为全球最令人担忧的问题 1.2. 科技行业仍难以摆脱广告业务放缓、投资者情绪转变以及用户参与模式变化带来的叠加影响1.2.1. 负面结果只是对科技行业在疫情期间出现…

生物聚酯塑料回收技术创新与商业应用

本文介绍了生物聚酯塑料的化学回收技术突破,包括EsterCycle低能耗甲醇解工艺和Glacier的AI视觉分拣系统,并通过商业试验验证了生物聚酯材料在零售场景中的应用效果,推动塑料循环价值链建设。更优塑料之路:进展与合…

189 轮转数组 - MKT

189 轮转数组 class Solution { public:// 通过1 time 0ms 100% space 30.mb 5% 自己 内存大void rotate1(vector<int>& nums, int k) {// 1 余数 2 是否大于边界// 10 6 16=6 12-10=2cout<<&quo…

SGD 到 AdamW 优化器的实践选型指南

在深度学习的模型训练过程中,优化器扮演着至关重要的角色。它就像一位经验丰富的向导,带领模型在复杂的参数空间中寻找最优解。从早期简单的随机梯度下降到如今广泛使用的 AdamW,优化器的发展历程充满了对效率与精度…

# ️ MySQL vs PostgreSQL架构深度对比分析报告

# ️ MySQL vs PostgreSQL架构深度对比分析报告Posted on 2025-10-16 02:32 吾以观复 阅读(1) 评论(0) 收藏 举报关联知识库:# ️ MySQL vs PostgreSQL架构深度对比分析报告️ MySQL vs PostgreSQL架构深度对比分…

# 韩国数据中心大火:647套系统因缺失双活集体宕机22小时

# 韩国数据中心大火:647套系统因缺失双活集体宕机22小时Posted on 2025-10-16 02:32 吾以观复 阅读(1) 评论(0) 收藏 举报关联知识库:# 韩国数据中心大火:647套系统因缺失双活集体宕机22小时韩国数据中心大火…

# TLP电池管理工具:Linux笔记本续航优化的终极指南

# TLP电池管理工具:Linux笔记本续航优化的终极指南Posted on 2025-10-16 02:32 吾以观复 阅读(0) 评论(0) 收藏 举报关联知识库:# TLP电池管理工具:Linux笔记本续航优化的终极指南TLP电池管理工具:Linux笔记…

LlamaIndex API Example

LlamaIndex API ExamplePosted on 2025-10-16 02:32 吾以观复 阅读(0) 评论(0) 收藏 举报关联知识库:LlamaIndex API ExampleReader and Query Engine documents = SimpleDirectoryReader(files).load_data() re…

AI中间件机遇与挑战:从Agent到组织级智能的技术演进

AI中间件机遇与挑战:从Agent到组织级智能的技术演进Posted on 2025-10-16 02:32 吾以观复 阅读(0) 评论(0) 收藏 举报关联知识库:AI中间件机遇与挑战:从Agent到组织级智能的技术演进️ AI中间件机遇与挑战:从…

# Redis日常使用与性能排查指南

# Redis日常使用与性能排查指南Posted on 2025-10-16 02:32 吾以观复 阅读(0) 评论(0) 收藏 举报关联知识库:# Redis日常使用与性能排查指南Redis日常使用与性能排查指南 草稿内容 常用命令:info指令 9大块 s…

金耀初讲座——高效演化神经结构搜索

金耀初讲座——高效演化神经结构搜索![assets/金耀初讲座——高效演化神经结构搜索/Untitled.png]] ![assets/金耀初讲座——高效演化神经结构搜索/Untitled 1.png]] ![assets/金耀初讲座——高效演化神经结构搜索/Unt…

二手车检查

二手车检查车源:二手车之家app和懂车帝app,因为上面车商具有营业资格,可初步筛选车商 询问时:漆面状态(哪些面补过漆) 换件情况 四门(大事故),四梁(前后横纵防撞梁),六柱(车身骨架),所有玻璃(批号显示…

图文并茂展示CSS li 排版大合集,总有一款是你刚好需要的

@目录🐱 A. 基础列表样式🌟 1. 默认样式📝 无序列表🔢 有序列表✨ 2. 自定义项目符号🚀 B. 高级布局与定位🖼️ 3. 使用图片作为项目符号🧹 4. 移除默认样式🧭 5. 水平导航栏💫 C. 创意与装饰效果�…

The lamentable decline of reading

https://www.ft.com/content/583de986-a295-4697-a2fe-3c6b13c99145 The lamentable decline of readingChildhood encouragement, libraries and government support can reverse the trendTHE EDITORIAL BOARDAdd to…

[FT.COM]The world should prepare for the looming quantum era

https://www.ft.com/content/96e14cb0-f49f-4632-b94f-2d1cdc625f8b The world should prepare for the looming quantum eraNew breakthroughs underscore the technology’s potential and perilsTHE EDITORIAL BOAR…

10.15 闲话

镜中的昆虫曹髦,字彦士,常称其为“高贵乡公”。甘露五年五月己丑日,在诛杀司马昭的过程中被成济刺死。 我认为三国杀对曹髦的刻画是非常成功的。【潜龙】属于前期劣势,后期爆发的技能。【清正】和【酒诗】都不算能…

函数的类型注释器

在看别人的代码的时候你是否会看到经常会有这种情况 def haha(aa:str) -> np.ndarray:pass这里面的:str还有->代表什么呢? 其实他们就是为了让我们的代码的函数更加容易理解,规范输入输出的类型,所以使用了函…

如何手动构建一个线性回归模型

import numpy as np from utils.features import prepare_for_training # 预处理 import torch as t# 现在开始构建线性回归 class LinearRegression():"""总结一下这个函数具体做了什么事情:1. 预处理…

Web Components 微前端实现与应用

Web Components 微前端实现与应用 1. 核心架构设计 1.1 微前端架构模式 // 微前端核心接口定义 interface MicroFrontendConfig {name: string;entry: string; // 应用入口container: string; // 挂载容…