2021-04-04 14:13:34
Redo Log与Undo Log是MySQL中保障事务特性的核心日志机制,其设计原理与协作流程如下:
Redo Log(重做日志)
核心作用:确保事务的持久性(Durability),通过物理日志记录数据页的修改,避免系统崩溃时内存数据丢失。
实现原理:
0:后台线程每秒刷盘,可能丢失1秒数据(高性能但风险高)。
1(默认):事务提交时同步刷盘,保证持久性但性能较低。
2:提交时写入操作系统内核缓冲区,由OS决定刷盘时机,性能与安全性折中。
Undo Log(回滚日志)
核心作用:保障事务的原子性(Atomicity)和实现多版本并发控制(MVCC)。
实现原理:
INSERT操作:记录主键值,回滚时直接删除对应行。
UPDATE/DELETE操作:记录修改前的旧值,回滚时恢复旧值或重新插入数据。
Insert Undo Log:事务提交后直接删除(无需MVCC支持)。
Update Undo Log:提交后放入版本链,由Purge线程判断是否删除(可能被其他事务的快照读引用)。
协作流程
修改数据时,同时生成redo log(记录“如何修改”)和Undo Log(记录“修改前状态”)。
Redo Log进入redo log buffer,Undo Log写入回滚段。
Redo Log通过刷盘策略持久化到磁盘。
Undo Log根据类型决定是否保留(Update类型需等待Purge)。
若redo log已持久化但数据未刷盘,根据redo log重做修改。
若事务未提交,根据Undo Log回滚未完成操作。
关键特性对比