温馨提示×

温馨提示×

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

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

Undo日志对MVCC作用

发布时间:2026-09-30 10:01:17 来源:亿速云 阅读:86 作者:小樊 栏目:数据库

在数据库系统中,Undo 日志(回滚日志)对 MVCC(多版本并发控制,Multi-Version Concurrency Control) 起着核心支撑作用。可以从“是什么、为什么需要、怎么起作用”三个层面理解。


一、Undo 日志是什么

Undo 日志记录了数据修改前的旧值(历史版本),用于:

  • 事务回滚(Rollback)
  • 崩溃恢复
  • 为 MVCC 提供历史版本数据

例如:

UPDATE users SET age=30 WHERE id=1;

Undo 日志会记录:

(旧值) id=1, age=20

二、MVCC 的基本原理(简要)

MVCC 通过保存数据的多个版本,让:

  • 读操作(快照读)不阻塞写
  • 写操作不阻塞读

实现方式通常包括:

  • 隐藏字段(事务ID、回滚指针)
  • Undo 日志链
  • 快照(ReadView)

三、Undo 日志对 MVCC 的关键作用

1️⃣ 提供“历史版本”数据

MVCC 的读操作(如 SELECT)需要看到事务开始时的数据快照:

  • 如果当前行已被其他事务修改
  • 数据库通过 回滚指针 沿着 Undo 日志往前找
  • 找到当前事务可见的旧版本

✅ 没有 Undo 日志,就无法构造历史版本


2️⃣ 构建版本链(Version Chain)

每一行数据通常包含:

  • trx_id(最后修改的事务ID)
  • roll_ptr(指向 Undo 日志的指针)

版本链示例:

当前行 (age=30, trx_id=102)
   ↓ roll_ptr
Undo (age=20, trx_id=100)
   ↓ roll_ptr
Undo (age=18, trx_id=95)

MVCC 读时:

顺着版本链,找到第一个“对自己可见”的版本


3️⃣ 保证“读一致性”(Read Consistency)

  • 事务 A 开始时看到快照
  • 事务 B 修改并提交
  • 事务 A 仍能看到修改前的数据

这是依靠:

Undo 日志 + 事务ID 可见性判断


4️⃣ 支持非锁定读(快照读)

常见 SQL:

SELECT * FROM users;
  • 不需要加锁
  • 通过 Undo 日志读取历史版本
  • 大幅提升并发性能

5️⃣ 配合事务隔离级别

隔离级别 Undo 日志作用
Read Committed 每次读都找最新可见版本
Repeatable Read 整个事务复用同一快照(Undo 支撑)
Serialization 通常加锁,Undo 作用减弱

四、总结一句话

Undo 日志是 MVCC 的“版本仓库”
没有 Undo 日志,MVCC 就无法实现多版本、快照读和高效并发。

如果你愿意,我也可以结合 InnoDB 的具体实现(隐藏列 + ReadView) 或 Redo / Undo 对比 再讲一层。

向AI问一下细节

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

AI
助
手