温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

MVCC如何实现多版本控制

发布时间:2026-09-09 20:40:59 来源:亿速云 阅读:87 作者:小樊 栏目:数据库

MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种在不加锁或尽量少加锁的情况下,实现高并发读写的数据库技术。核心思想是:为数据保存多个版本,读操作读旧版本,写操作生成新版本,从而避免读写互相阻塞。

下面以 InnoDB(MySQL) 为例,系统说明 MVCC 如何实现多版本控制。


一、MVCC 的核心组成

1. 隐藏列(每行数据自带)

InnoDB 每行记录中隐藏了关键字段:

  • DB_TRX_ID(事务 ID)
    最后一次修改该行的事务 ID
  • DB_ROLL_PTR(回滚指针)
    指向 undo log 中该行的上一个版本
  • DB_ROW_ID(可选)
    行标识

2. Undo Log(回滚日志)

  • 每次更新数据,旧版本不会立即删除
  • 旧版本写入 undo log
  • 通过 roll_ptr 形成版本链

示例:

最新版本 ──> 旧版本 ──> 更旧版本 ──> ...

3. Read View(读视图)

Read View 决定“我能看到哪个版本”

包含:

  • 当前活跃事务 ID 列表
  • 最小事务 ID
  • 下一个将分配的事务 ID

二、MVCC 的版本可见性规则(重点)

当一个事务读取一行数据时:

只读取“对自己可见”的版本

判断规则(简化版):

  1. 如果 DB_TRX_ID < 最小活跃事务 ID
    ✅ 已提交,可见
  2. 如果 DB_TRX_ID 在活跃事务列表中
    ❌ 未提交,不可见
  3. 如果 DB_TRX_ID ≥ 下一个事务 ID
    ❌ 未来事务,不可见
  4. 否则,沿 undo log 找上一个版本,重新判断

三、MVCC 在不同隔离级别下的行为

1. READ COMMITTED(RC)

  • 每次 SELECT 都生成新的 Read View
  • 能看到其他事务已提交的最新版本

2. REPEATABLE READ(RR,MySQL 默认)

  • 事务第一次 SELECT 时生成 Read View
  • 整个事务复用同一个 Read View
  • 解决不可重复读

四、MVCC 如何实现“多版本控制”(总结流程)

写操作(UPDATE)

  1. 拷贝当前行到 undo log
  2. 修改当前行
  3. 更新 DB_TRX_ID 和 DB_ROLL_PTR

读操作(SELECT)

  1. 获取 Read View
  2. 从最新版本开始遍历版本链
  3. 找到第一个“对自己可见”的版本

五、MVCC 的优势与限制

✅ 优点

  • 读不阻塞写,写不阻塞读
  • 高并发性能好

❌ 限制

  • 不能解决写写冲突
  • 需要配合锁(Next-Key Lock)防止幻读
  • 旧版本堆积(依赖 purge 线程清理)

如果你愿意,我也可以:

  • 用示意图画出版本链
  • 对比 PostgreSQL MVCC
  • 结合**事务隔离问题(脏读/幻读)**讲

你想从哪一块继续深入?

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手