MySql MVCC的原理总结

MySQL MVCC 原理详解

MVCC (Multi-Version Concurrency Control,多版本并发控制) 是 MySQL 实现并发访问控制的核心机制之一,主要应用于 InnoDB 存储引擎。

一、MVCC 基本概念

MVCC 是一种通过保存数据在某个时间点的快照来实现并发控制的方法。它使得不同事务在同一时间看到的数据版本可能不同,从而避免了读取操作被写入操作阻塞。

二、MVCC 核心组件

1. 隐藏字段

InnoDB 每行记录都包含几个隐藏字段:

  • DB_TRX_ID:6字节,记录最近修改该行数据的事务ID
  • DB_ROLL_PTR:7字节,指向该行回滚段的指针(即指向undo log)
  • DB_ROW_ID:6字节,隐藏的自增ID(当没有主键时生成)

2. Undo Log

存储数据被修改前的值,用于:

  • 事务回滚
  • 实现MVCC,提供历史版本数据

3. Read View

事务进行快照读时产生的读视图,包含:

  • trx_ids:当前活跃(未提交)事务ID列表
  • low_limit_id:创建ReadView时系统应该分配给下一个事务的ID
  • up_limit_id:活跃事务列表中最小的事务ID
  • creator_trx_id:创建该ReadView的事务ID

三、MVCC 实现原理

1. 版本链

每行记录通过 DB_ROLL_PTR 指向 undo log 形成一个版本链,可以回溯到该记录的所有历史版本。

2. 可见性判断规则

判断记录某个版本是否对当前事务可见:

  1. 如果 DB_TRX_ID == creator_trx_id:当前事务修改的记录,可见
  2. 如果 DB_TRX_ID < up_limit_id:该版本在ReadView创建前已提交,可见
  3. 如果 DB_TRX_ID >= low_limit_id:该版本在ReadView创建后产生,不可见
  4. 如果 up_limit_id <= DB_TRX_ID < low_limit_id
    • 如果 DB_TRX_IDtrx_ids 列表中:未提交,不可见
    • 否则:已提交,可见

3. 不同隔离级别的实现

  • READ COMMITTED:每次读取都生成新的ReadView
  • REPEATABLE READ:第一次读取时生成ReadView,后续复用

四、MVCC 操作示例

插入操作

  1. 分配事务ID
  2. 写入数据,设置 DB_TRX_ID 为当前事务ID
  3. DB_ROLL_PTR 指向 undo log 中的插入记录

更新操作

  1. 分配事务ID
  2. 将当前记录拷贝到 undo log
  3. 修改当前记录,更新 DB_TRX_IDDB_ROLL_PTR

删除操作

  1. 分配事务ID
  2. 将当前记录拷贝到 undo log
  3. 设置记录的删除标志位

五、MVCC 优缺点

优点

  • 读不加锁,读写不冲突
  • 提高了并发性能
  • 实现了非阻塞读

缺点

  • 需要维护多个版本,增加了存储空间
  • 需要定期清理不再需要的版本数据
  • 写操作仍然需要加锁

六、MVCC 与 Purge 机制

InnoDB 通过 Purge 线程清理不再需要的 undo log:

  • 当没有事务需要访问这些旧版本时
  • 系统表空间中记录最老的ReadView,确定哪些版本可以清理

MVCC 是 MySQL 实现高并发的重要机制,理解其原理对于优化数据库性能和解决并发问题非常有帮助。

相关推荐
用户30745969820710 分钟前
乐观锁与悲观锁
mysql
cui178756812 分钟前
物业费收缴困局的破题之路:2026年社区商业逻辑的底层重构
大数据·数据库·人工智能
是发财不是旺财33 分钟前
Hermes 网关四层权限控制方案:让 AI Agent 安全地查数据库
数据库·安全·agent·openclaw·hermes
阿正的梦工坊1 小时前
【Rust】04-借用、引用与切片
java·数据库·rust
AOwhisky1 小时前
学习自测与解析:MySQL第五、六、七期核心知识点详解
运维·数据库·笔记·学习·mysql·云计算
阿标在干嘛1 小时前
政策平台的推送系统:消息队列、定时任务、AB测试的工程实践
服务器·数据库·ab测试
Upsy-Daisy1 小时前
Hermes Agent 学习笔记 02:安装、配置与第一次运行
java·前端·数据库
Tongpao_SSDHDD2 小时前
希捷酷鹰ST6000VX008实测解析:中小安防监控高性价比存储方案
大数据·数据库·人工智能
蓝鸟19742 小时前
Oracle超大DMP备份文件瘦身、日志精简、磁盘空间优化实战方案日志
数据库·oracle·数据库运维·生产运维实战·oracle避坑·磁盘空间优化·oracle日志清理
梦想的旅途22 小时前
企业微信外部群主动调用:RPA 接口与官方 API 的技术边界
网络·mysql·自动化·企业微信·rpa