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 的反向副本;回滚、崩溃恢复与复制分别使用不同机制。

官方出处与源码

回到首页 · 上一篇 · 下一篇