news 2026/7/12 4:47:58

进阶-InnoDB引擎-MVCC

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
进阶-InnoDB引擎-MVCC

一、MySQL进阶

“当两个用户同时查看同一份数据,你希望看到的是‘当前状态’,还是‘事务开始时的状态’?”
—— MVCC(多版本并发控制),让数据库在高并发下依然保持“一致性”与“高效性”

为什么需要MVCC?——一场“读写冲突”的危机

在传统数据库中,读操作会阻塞写操作,写操作会阻塞读操作。例如:

  • 事务A:UPDATE orders SET status='shipped' WHERE order_id=100
  • 事务B:SELECT * FROM orders WHERE order_id=100

如果事务B在事务A未提交时执行,会发生什么?

  • 悲观锁:事务B必须等待事务A提交(锁表),导致性能下降
  • 乐观锁:事务B直接读取,但可能读到未提交数据(脏读)

💡2010年,某电商网站因锁表问题导致双11期间响应时间从50ms飙升至500ms,损失超百万!
这就是MVCC诞生的背景在不加锁的情况下,实现高并发读写

1. InnoDB引擎-MVCC

📌 什么是MVCC?

MVCC(Multi-Version Concurrency Control)是一种并发控制机制,它通过保存数据的多个版本,让读操作无需等待写操作,从而实现“读不阻塞写,写不阻塞读”

📌 两种读操作:

类型说明举例是否加锁
当前读(Current Read)读取最新数据(已提交)SELECT ... FOR UPDATE
UPDATE
DELETE
✅ 加锁(X锁)
快照读(Snapshot Read)读取事务开始时的快照SELECT *❌ 不加锁

💡关键点快照读是MVCC的核心,它利用历史版本实现非阻塞读。

MVCC的核心组件:三个隐式字段

InnoDB 通过三个隐藏字段(在表中不可见)实现MVCC

字段作用类型说明
DB_TRX_ID记录最近修改该行的事务ID6字节用于判断行是否对当前事务可见
DB_ROLL_PTR指向Undo Log的指针7字节用于找到历史版本
DB_ROW_ID隐藏的行ID(自增)6字节在索引中作为回表的唯一标

💡为什么需要这些字段?

  • DB_TRX_ID:判断行是否已提交
  • DB_ROLL_PTR:通过Undo Log找到旧版本
  • DB_ROW_ID:在索引中唯一标识行(即使主键未指定)

Undo Log:数据的“时间胶囊”

Undo Log 是 MVCC 的基础,它记录了数据修改前的旧值,用于:

  • 事务回滚
  • MVCC 快照读

📌 Undo Log 两种类型:

类型作用说明
INSERT记录插入的行用于事务回滚(删除时需恢复)
UPDATE记录修改前的旧值用于快照读和回滚(更新时需恢复)

💡Undo Log 的存储
由 InnoDB 的Undo Tablespace管理,可以配置多个 Undo Log 文件(MySQL 5.7+ 支持独立Undo表空间)。

数据版本链:Undo Log 的“链式存储”

当一行数据被多次修改时,Undo Log 会形成版本链

最新版本 → (DB_ROLL_PTR) → 旧版本 → (DB_ROLL_PTR) → 更旧版本 → ... → 初始版本

💡举例

  • 初始:balance=1000
  • 事务1:UPDATE balance=800→ 生成Undo Log(记录1000)
  • 事务2:UPDATE balance=500→ 生成Undo Log(记录800)

版本链:500 → 800 → 1000

ReadView:MVCC的“时间机器”

ReadView是事务开始时生成的快照,它决定了哪些版本对当前事务可见。

📌 ReadView 包含的关键信息:

字段说明
min_trx_id活跃事务最小ID(当前正在执行的事务ID)
max_trx_id活跃事务最大ID(当前正在执行的事务ID上限)
m_ids活跃事务ID列表(当前正在执行的事务ID集合)
def is_visible(trx_id, readview): if trx_id < readview.min_trx_id: # 已提交 return True elif trx_id >= readview.max_trx_id: # 未提交 return False else: # 在活跃事务列表中 if trx_id in readview.m_ids: # 未提交 return False else: # 已提交 return True

💡关键点

  • RR级别(可重复读):事务开始时生成ReadView,后续查询都使用同一ReadView
  • RC级别(读已提交):每次查询都生成新的ReadView

MVCC工作原理:一次事务的“时间穿越”

假设执行:

-- 事务A(ID=100) START TRANSACTION; SELECT * FROM accounts WHERE user_id=1; -- 快照读 UPDATE accounts SET balance=500 WHERE user_id=1; -- 当前读 COMMIT; -- 事务B(ID=101) START TRANSACTION; SELECT * FROM accounts WHERE user_id=1; -- 快照读

📌 MVCC如何工作?

  1. 事务A开始
    • 生成ReadView:min_trx_id=100, max_trx_id=102, m_ids=[100]
    • 执行SELECT:快照读,使用ReadView判断可见性
  2. 事务A执行UPDATE
    • 修改行,生成Undo Log(记录旧值:1000 → 500)
    • DB_TRX_ID更新为100
    • DB_ROLL_PTR指向Undo Log
  3. 事务B执行SELECT
    • 生成ReadView:min_trx_id=101, max_trx_id=102, m_ids=[101]
    • 读取行:DB_TRX_ID=100 < 101→ 可见(值为1000)

🌟效果:事务B在事务A未提交时,读到的是1000(事务A开始时的值),而非500(当前值)。

MVCC在不同隔离级别下的表现

隔离级别快照读可见性规则幻读说明
读未提交不使用MVCC直接读最新数据无MVCC
读已提交使用MVCC每次查询生成新ReadView无法避免不可重复读
可重复读使用MVCC事务开始时生成ReadView通过Next-Key Lock避免幻读
串行化不使用MVCC强制加锁无MVCC

💡为什么RR级别能避免幻读?
InnoDB 在RR级别下使用Next-Key Lock(记录锁 + 间隙锁),在读取时不仅锁住记录,还锁住间隙,防止其他事务插入新数据。

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

萤石开放平台 萤石可编程设备 | 设备 Python SDK 使用说明

摄像头SDK介绍与使用说明一、SDK概述本SDK提供摄像头设备的完整控制能力&#xff0c;涵盖SD卡管理、云台控制、网络配置、媒体录制、告警管理等核心功能。支持异步操作、参数配置及状态查询&#xff0c;适用于可编程摄像头设备的开发与维护。二、核心功能模块1. 存储管理SD卡操…

作者头像 李华
网站建设 2026/7/1 7:52:15

西门子PLC的步进电机直接控制(设计源文件+万字报告+讲解)(支持资料、图片参考_相关定制)

目 录 摘 要 III ABSTRACT IV 第一章 绪 论 1 1.1引言 1 第二章 方案论证比较设计 3 2.1PLC技术的发展概述 3 2.2PLC技术在步进电机控制中的发展状况 4 2.3步进电机的发展状况 5 2.4 步进电机的工作原理 7 2.5步进电机的控制和驱动方法简介 8 第三章 步进电机工作方式的…

作者头像 李华
网站建设 2026/7/5 8:22:27

数学错题整理(会更新的)

1.1 集合答案:B 错选:A 解析:易错点是③&#xff0c;这两个看似完全不相同的集合但实际上他们都满足x2≥0,x≥0x^2\geq0,\sqrt{x}\geq0x2≥0,x​≥0,所以本质上他们是一样的&#xff01;&#xff01;答案:错选:①② 解析:方程组的解是一个整体&#xff0c;不能这么表示

作者头像 李华
网站建设 2026/7/4 10:27:59

django基于python的社区老年人关爱服务系统的设计与实现

目录摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着人口老龄化加剧&#xff0c;社区老年人关爱服务需求日益增长。传统服务模式存在效率低、资源分配不均等问题&…

作者头像 李华
网站建设 2026/7/1 7:52:16

django-flask基于python的大学生兼职网站的设计与实现

目录摘要关于博主开发技术路线相关技术介绍核心代码参考示例结论源码lw获取/同行可拿货,招校园代理 &#xff1a;文章底部获取博主联系方式&#xff01;摘要 随着互联网技术的快速发展&#xff0c;在线兼职平台已成为大学生获取社会实践机会的重要渠道。本文基于Python技术栈&…

作者头像 李华
网站建设 2026/7/1 3:06:11

学霸同款9个AI论文软件,本科生轻松搞定毕业论文!

学霸同款9个AI论文软件&#xff0c;本科生轻松搞定毕业论文&#xff01; 1.「千笔」—— 一站式学术支持“专家”&#xff0c;从初稿到降重一步到位&#xff08;推荐指数&#xff1a;★★★★★&#xff09;对于本科生来说&#xff0c;论文写作不仅是对知识的综合运用&#xff…

作者头像 李华