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

相关推荐
helloworldandy1 小时前
使用Pandas进行数据分析:从数据清洗到可视化
jvm·数据库·python
数据知道3 小时前
PostgreSQL 故障排查:如何找出数据库中最耗时的 SQL 语句
数据库·sql·postgresql
qq_12498707533 小时前
基于SSM的动物保护系统的设计与实现(源码+论文+部署+安装)
java·数据库·spring boot·毕业设计·ssm·计算机毕业设计
枷锁—sha3 小时前
【SRC】SQL注入WAF 绕过应对策略(二)
网络·数据库·python·sql·安全·网络安全
Coder_Boy_3 小时前
基于SpringAI的在线考试系统-考试系统开发流程案例
java·数据库·人工智能·spring boot·后端
Gain_chance3 小时前
35-学习笔记尚硅谷数仓搭建-DWS层最近n日汇总表及历史至今汇总表建表语句
数据库·数据仓库·hive·笔记·学习
此生只爱蛋3 小时前
【Redis】主从复制
数据库·redis
马猴烧酒.4 小时前
【面试八股|JAVA多线程】JAVA多线程常考面试题详解
java·服务器·数据库
天天爱吃肉82184 小时前
跟着创意天才周杰伦学新能源汽车研发测试!3年从工程师到领域专家的成长秘籍!
数据库·python·算法·分类·汽车
大巨头4 小时前
sql2008 数据库分页语句
数据库