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

MySQL--MVCC

1. 什么是 MVCC?

  • MVCC (Multi-Version Concurrency Control,多版本并发控制)

  • 核心思想:通过保存数据的多个版本,让读操作无需阻塞写操作,从而实现 高并发下的读写一致性

  • MVCC 主要用来实现:

    • 一致性读(Consistent Read,快照读)

    • 非阻塞读(读不加锁)

👉 MVCC 是 InnoDB 实现 事务隔离性(Isolation) 的关键机制。


2. MVCC 依赖的机制

(1) 隐藏字段

InnoDB 在每行数据后面都会存储一些隐藏字段:

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

  • DB_ROLL_PTR:回滚指针,指向 Undo Log(用于找到之前版本的数据)

  • DB_ROW_ID:自增 ID(如果没有主键时生成)

(2) Undo Log

  • 作用:保存数据的旧版本,用于回滚 & MVCC 提供历史版本。

  • 每次 UPDATE/DELETE 都会生成对应的 Undo Log 记录旧值。

  • 链表结构:通过 DB_ROLL_PTR 串联起来,形成一条数据的版本链。

(3) Read View

  • Read View = 一致性视图,用于判断当前事务能看到哪些版本。

  • 在事务执行 快照读 时生成,包含以下关键字段:

    • m_ids:系统当前活跃事务 ID 列表

    • min_trx_id:活跃事务的最小 ID

    • max_trx_id:下一个将分配的事务 ID(未分配,意味着比它大的事务还没开始)

    • creator_trx_id:创建该 Read View 的事务 ID

👉 Read View 决定了 可见性规则


3. MVCC 的可见性规则

当事务执行 快照读 时,判断某个版本是否可见的逻辑:

设数据版本的 DB_TRX_ID = X

  1. 如果 X < min_trx_id → 表示事务已经提交 → 可见

  2. 如果 X ≥ max_trx_id → 表示事务还没开始 → 不可见

  3. 如果 min_trx_id ≤ X < max_trx_id → 表示事务可能在活跃中:

    • 如果 X ∈ m_ids(活跃事务列表) → 不可见(因为还没提交)

    • 如果 X ∉ m_ids → 可见(说明已经提交了)


4. 快照读 vs 当前读

  • 快照读(Snapshot Read)

    • SELECT * FROM table WHERE ...;

    • 不加锁,读取 Read View 可见的版本

    • 使用 MVCC 保证一致性

  • 当前读(Current Read)

    • SELECT ... FOR UPDATE / SELECT ... LOCK IN SHARE MODE

    • UPDATE / DELETE / INSERT

    • 读取最新版本,并且对数据加锁,防止并发修改

👉 总结:快照读 → MVCC 机制; 当前读 → 加锁机制。


5. MVCC 与事务隔离级别

  • 读未提交(Read Uncommitted)

    • 不使用 MVCC,直接读最新版本,可能产生脏读。

  • 读已提交(Read Committed)

    • 每次执行 SELECT 都生成新的 Read View。(和可重复读不同的关键点)

    • 只能看到已提交事务的数据,避免脏读。

    • 但会产生 不可重复读

  • 可重复读(Repeatable Read,InnoDB 默认)

    • 在事务第一次 SELECT 时生成 Read View,整个事务期间都使用这个快照。(和读已提交不同的关键点)

    • 避免脏读、不可重复读。

    • 但会有 幻读 → 通过 间隙锁(Gap Lock) 解决。

  • 串行化(Serializable)

    • 不用 MVCC,所有读写都加锁,效率最低。


6. 一个更新操作下的 MVCC 示例

假设有一行数据:id=1, name="Tom"

  • T1:事务 A 更新 name="Jerry"

    • 在 Undo Log 中保存旧版本 "Tom"

    • DB_TRX_ID = A

  • T2:事务 B 开始,生成 Read View(活跃事务包含 A)

    • B 执行 SELECT name FROM user WHERE id=1;

    • 判断可见性:因为 A 还没提交,所以 B 只能看到 "Tom"

  • T3:事务 A 提交

  • T4:事务 B 再次执行 SELECT

    • 由于在 RR 隔离级别 下,B 使用的还是最初的 Read View

    • 所以仍然看到 "Tom"(保证可重复读)

👉 这就是 MVCC 保证一致性读 的效果。


7. 为什么需要 MVCC?

  • 如果没有 MVCC

    • 所有读操作都必须加锁 → 读写互斥 → 并发性能极差。

  • 有了 MVCC

    • 读操作可以不加锁,直接通过历史版本判断可见性;

    • 读写分离,提升数据库并发性能。


一句话总结:
MySQL InnoDB 的 MVCC 通过 隐藏字段 + Undo Log + Read View 实现,让事务在并发下能“读旧版本”,从而做到 非阻塞读一致性读,是高性能的关键。

http://www.dtcms.com/a/342804.html

相关文章:

  • MPS MPQ2013AGQ-AEC1-Z MPS芯源汽车级 同步降压转换器IC 电源传感器IC
  • 【密码学】深入浅出栅栏密码:原理、流程与实现
  • Android:compose-Scaffold组件
  • 【CS创世SD NAND征文】存储芯片在工业电表中的应用与技术演进
  • 基于Python与Tkinter开发的微博多功能自动化助手
  • 构建包含IK插件(中文分词插件)的Elasticsearch镜像
  • 分治思想在系统分流削峰中的实践与Golang前沿实现
  • RK3568项目(十六)--linux驱动开发之块设备介绍
  • C++ 序列式容器深度解析:vector、string、deque 与 list
  • 虚幻基础:曲线
  • Go 并发编程-channel
  • Java的反射与枚举
  • 贪吃蛇游戏(纯HTML)
  • 服务发现与负载均衡:Kubernetes Service核心机制深度解析
  • Vue数据的变更操作与表单数据的收集【6】
  • 动漫短剧小程序系统开发|动漫短剧小程序搭建|动漫短剧源码交付
  • 后浪来袭:NIST 轻量级密码标准化决赛圈算法剖析(ASCON、SPARKLE 等)
  • AI翻唱实战:用[灵龙AI API]玩转AI翻唱 – 第6篇
  • RocketMQ 消息消费 单个消费和批量消费配置实现对比(Springboot),完整实现示例对比
  • TCP连接
  • 华为开发者空间训练营-优秀作品公布
  • PyTorch深度学习遥感影像地物分类与目标检测、分割及遥感影像问题深度学习优化——CNN原理、Faster RCNN/YOLO检测到U-Net分割等
  • 13、按键输入检测
  • ES_索引模板
  • flutter_rust_bridge的前世今生
  • Mysql InnoDB 底层架构设计、功能、原理、源码系列合集【一、InnoDB 架构先导。主讲模块划分,各模块功能、源码位置、关键结构体/函数】
  • 无人机长距离高速传输技术解析
  • cuda之sass分析
  • 机器人组装MES系统:破解行业痛点,打造数字化智能工厂
  • 对象存储解决方案:MinIO 的架构与代码实战