redo log 和 binlog 怎么保证一起成功
binlog 是 Server 层写的,redo log 是 InnoDB 写的,两个文件不可能一次写完。一次 COMMIT 内部走的是两阶段提交:
- InnoDB 把 redo 记成 prepare
- Server 写 binlog
- InnoDB 把 redo 记成 commit
两边靠事务的 XID 对账。崩溃后重启,碰到 prepare 了但没 commit 的事务:
- binlog 里有这个 XID:提交
- 没有:回滚
为什么以 binlog 为准?因为 binlog 可能已经被从库或备份拿走了,主库得和它保持一致。
这不是你能用 BEGIN 控制的另一笔事务,而是你那次 COMMIT 的实现细节。也没有任何 SQL 能直接往 redo 或 binlog 里写东西。