https://www.cnblogs.com/gustavo

Gustavo's Blog

人类的赞歌是勇气的赞歌!

[Mysql] 两段提交

 

提交

mysql> show variables like  '%autocommit%' ;  1  Variable_name  I Value I  autocommit  I ON  row in set (0.01 sec)

Mysql 认开启提交事

 

 

两段提交

把一个事务分成两个阶段来提交,就是把redolog拆分成了preparecommit两段

 

更 新 记 录 R  InnoDB 该 行 、 〔 載  Buffer P00 ]  将 R 行 的 旧 值 写 入 undolog  史 新 内 存 中 的 数 啹  执 行 器 写 入 redo 》 og  (prepare)  执 行 器 写 binlog  执 行 器 写 入 redo 》 og  (commit)  一 蚧 段 提 》 .  一 蚧 段 提 .

 

 

MySQL想要准备事务的时候会先写redolog、binlog分成两个阶段。

  1. 两阶段提交的第一阶段 (prepare阶段):写rodo-log 并将其标记为prepare状态。
  2. 紧接着写binlog
  3. 两阶段提交的第二阶段(commit阶段):写bin-log 并将其标记为commit状态。

 

为了保证redolog和binlog数据的安全一致性只有在这两个日志文件逻辑上高度一致了。你才能放心地使用redolog帮你将数据库中的状态恢复成crash之前的状态,使用binlog实现数据备份、恢复、以及主从复制。而两阶段提交的机制可以保证这两个日志文件的逻辑是高度一致的。

 

 

 

问题

 

如果在step1阶段执行完之后,宕机了,怎么恢复呢?

会根据redolog将修改后的recovery出来,然后提交。

 

如何判断binlogredolog是否达成了一致?

当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。

 

 

posted @ 2022-04-23 17:08  BitBean  阅读(497)  评论(0编辑  收藏  举报