(Mysql)MVCC、Redo Log 与 Undo Log
1. MVCC(多版本并发控制)
概念
MVCC(Multi-Version Concurrency Control)是一种数据库并发控制机制,用于解决 读写冲突,提高数据库并发性能。MySQL InnoDB 存储引擎使用 MVCC 来实现 非阻塞读(即读取时不加锁)。
核心原理
每行数据在内存中有多个版本。
每个版本包含两个隐藏列:
trx_id
:记录创建该版本的事务 ID。roll_pointer
(或undo_pointer
):指向旧版本 Undo Log。
读取数据时,事务根据 自己的快照版本 决定看到哪个版本的数据。
作用
支持 一致性读(Consistent Read)
避免读操作阻塞写操作
与事务隔离级别结合使用(如 Repeatable Read)
举例
事务 A 读取数据时看到的版本是事务开始时的快照
事务 B 更新同一行数据时,会生成新版本,并在 Undo Log 中保存旧版本
事务 A 仍然看到旧版本,不会被阻塞
2. Redo Log(重做日志)
概念
Redo Log 是 InnoDB 的 物理日志,用于 保证事务的持久性(Durability)。
特点
顺序写入磁盘,性能高
数据写入前先写 Redo Log,再刷入数据页(Write-Ahead Logging)
崩溃恢复时,通过 Redo Log 恢复已提交事务的数据
顺序流程(插入数据示例)
事务写入 Redo Log(WAL,顺序追加)
数据页写入缓冲池
事务提交时,Redo Log 刷盘(保证持久性)
作用
崩溃恢复:只要 Redo Log 存在,已提交的数据可以恢复
提高写入性能:顺序写比随机写快
3. Undo Log(回滚日志)
概念
Undo Log 是 InnoDB 的 逻辑日志,用于 事务回滚 和 MVCC 版本管理。
特点
每条修改操作都会记录 Undo Log
保存的是旧数据版本
写操作失败或事务回滚时,用 Undo Log 恢复数据
作用
事务回滚:事务出错时,可通过 Undo Log 回到操作前状态
MVCC 读:一致性读时,事务可通过 Undo Log 获取旧版本数据
示例
数据库原值:
A = 10
事务修改:
A = 20
Undo Log 保存旧值
A = 10
事务回滚时,用 Undo Log 恢复
A = 10
4. Redo Log vs Undo Log
特性 | Redo Log | Undo Log |
---|---|---|
类型 | 物理日志 | 逻辑日志 |
存储位置 | 磁盘顺序写 | 内存 + 磁盘 |
用途 | 崩溃恢复 | 回滚、MVCC版本读取 |
记录内容 | 新数据 | 旧数据 |
持久性 | 持久化(保证事务提交) | 临时(事务回滚后可释放) |
5. 总结
MVCC:保证高并发下的一致性读,靠 Undo Log 保存历史版本
Redo Log:保证事务提交的持久性,顺序写入磁盘
Undo Log:支持事务回滚和 MVCC 版本管理
理解技巧:
Redo Log = Ctrl+S(存储最新修改,保证不会丢)
Undo Log = Ctrl+Z(保存历史版本,可以撤回操作)
MVCC = 时间旅行(每个事务看到自己时间点的版本)