[Mysql] 两段提交
事务提交

Mysql 默认开启自动提交事务
两段提交
把一个事务分成两个阶段来提交,就是把redolog拆分成了prepare和commit两段
![更 新 记 录 R InnoDB 该 行 、 〔 載 Buffer P00 ] 将 R 行 的 旧 值 写 入 undolog 史 新 内 存 中 的 数 啹 执 行 器 写 入 redo 》 og (prepare) 执 行 器 写 binlog 执 行 器 写 入 redo 》 og (commit) 一 蚧 段 提 》 . 一 蚧 段 提 .](https://img2022.cnblogs.com/blog/697827/202204/697827-20220423171022189-1352975947.png)
MySQL想要准备事务的时候会先写redolog、binlog分成两个阶段。
- 两阶段提交的第一阶段 (prepare阶段):写rodo-log 并将其标记为prepare状态。
- 紧接着写binlog
- 两阶段提交的第二阶段(commit阶段):写bin-log 并将其标记为commit状态。
为了保证redolog和binlog数据的安全一致性。只有在这两个日志文件逻辑上高度一致了。你才能放心地使用redolog帮你将数据库中的状态恢复成crash之前的状态,使用binlog实现数据备份、恢复、以及主从复制。而两阶段提交的机制可以保证这两个日志文件的逻辑是高度一致的。
问题
如果在step1阶段执行完之后,宕机了,怎么恢复呢?
会根据redolog将修改后的recovery出来,然后提交。
如何判断binlog和redolog是否达成了一致?
当MySQL写完redolog并将它标记为prepare状态时,并且会在redolog中记录一个XID,它全局唯一的标识着这个事务。而当你设置`sync_binlog=1`时,做完了上面第一阶段写redolog后,mysql就会对应binlog并且会直接将其刷新到磁盘中。磁盘上的row格式的binlog记录。binlog结束的位置上也有一个XID。
只要这个XID和redolog中记录的XID是一致的,MySQL就会认为binlog和redolog逻辑上一致。就上面的场景来说就会commit,而如果仅仅是rodolog中记录了XID,binlog中没有,MySQL就会RollBack。
两份日志文件逻辑对齐的标记是有一份相同的XID。

浙公网安备 33010602011771号