02 事务与 redo、undo 日志
事务与 redo、undo 日志
undo 支持回滚和旧版本读取,redo 支持崩溃后重做;启用 binlog 时,Server 与 InnoDB 还要协调提交。
版本:MySQL Community Server 26.10.0(InnoDB);核实日期:2026-11-12。官方在线文档可能继续更新,源码链接固定到对应发布标签。图为原理抽象,省略非本页重点。
specification {
element actor { style { shape person; color amber } }
element system { style { color muted } }
element component { style { color primary } }
element storage { style { shape storage; color green } }
}
model {
c = actor '客户端'
srv = component 'Server 事务协调'
inn = component 'InnoDB'
undo = storage 'undo / 旧版本'
redo = storage 'redo 日志'
bin = storage 'binlog'
}
views {
dynamic view index {
title '核心链路'
variant sequence
c -> srv '事务内 UPDATE'
srv -> inn '执行修改并获取所需锁'
inn -> undo '记录回滚与版本链信息'
inn -> inn '修改内存数据页并产生 redo'
c -> srv 'COMMIT'
srv -> inn '进入 prepare 阶段'
inn -> redo '满足日志持久化策略'
srv -> bin '写入并按策略同步 binlog'
srv -> inn '完成引擎 commit'
srv -> c '返回提交成功'
}
}
关键判断
- 图是启用 binlog 时的逻辑提交阶段,内部存在组提交与并发,不能把每个箭头当作单独一次 fsync。
- innodb_flush_log_at_trx_commit 与 sync_binlog 会影响崩溃耐久;要求严格耐久时要结合配置、存储与故障模型判断。
- 提交时不必刷完所有脏页,WAL 要求对应 redo 先持久化;undo 的历史版本仍可能被长事务读取,提交后未必立刻清理。
边界
redo 不承担跨实例逻辑复制,undo 也不是 redo 的反向副本;回滚、崩溃恢复与复制分别使用不同机制。