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 实现高并发的重要机制,理解其原理对于优化数据库性能和解决并发问题非常有帮助。

相关推荐
计算机毕设VX:Fegn089525 分钟前
计算机毕业设计|基于springboot + vue动物园管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
冉冰学姐1 小时前
SSM校园排球联赛管理系统y513u(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
数据库·ssm 框架应用·开题报告、
Tony Bai1 小时前
【分布式系统】03 复制(上):“权威中心”的秩序 —— 主从架构、一致性与权衡
大数据·数据库·分布式·架构
wb043072012 小时前
SQL工坊不只是一个ORM框架
数据库·sql
至善迎风2 小时前
Redis完全指南:从诞生到实战
数据库·redis·缓存
QQ_4376643144 小时前
Redis协议与异步方式
数据库·redis·bootstrap
纪莫5 小时前
技术面:MySQL篇(InnoDB事务执行过程、事务隔离级别、事务并发异常)
数据库·java面试⑧股
Nerd Nirvana5 小时前
数据库模型全景:从原理到实践的系统性指南
数据库·oracle·电力行业
SelectDB5 小时前
从 Greenplum 到 Doris:集群缩减 2/3、年省数百万,度小满构建超大规模数据分析平台经验
数据库·数据分析·apache
alonewolf_995 小时前
MySQL索引优化实战二:分页、关联查询与Count优化深度解析
数据库·mysql