mysql-事务的两阶段提交

609 阅读2分钟

参考链接

两阶段提交的作用

为了保证两份日志(redolog和binlog)的的逻辑一致性,mysql采用【两阶段日志】提交

两阶段提交的恢复

step1,顺序扫描redolog,如果 既有prepare标识 也有commit标识,就直接提交,(复制 redolog disk数据页数据到磁盘上数据页)

step2,如果redolog只有prepare标识 ,没有commit标识,(说明当时事务在提交时候,crash了,或者在写binlog时失败了),拿着redolog当前事务的Xid,(redolog 和 binlog事务落盘的标识),去 binlog中查看是否有 Xid

场景1:binlog有写入,最后往redolog写commit失败了

binlog中有当前事务的Xid,则提交事务(复制redolog disk中的数据页到磁盘数据页)

场景2:写binlog时失败了。

没有当前事务Xid,则回滚事务(使用undolog来删除redolog中的对应事务)

什么是两节点提交

2pc

redo分为两个步骤,两个阶段提交

1、prepare(redolog)

2、写binlog

3、commit(redolog)

通过Xid,将 redo 和binlog关联在一起。

顺序写入会有什么问题?

redolog 适用于-主库(DML)

binlog 适用于-从库,主库

  • 先写redolog 后写binlog

step1:redolog【prepare,commit】写完

step2:binglog还未写完时候,mysql异常

此时在做数据恢复的时候,主库有从库没有

  • 先写binlog 后写redolog

Step1:binlog 写完

Step2:准备写 redolog 时发生了 异常了

此时在做数据恢复的时候,从库有主库没有

binlog和redolog可以相互替代吗?

  • 只要redolog 不要 binlog

redolog是以循环写的方式记录日志的, 所以无法保留历史记录,无法进行数据恢复。

  • 只要binlog 不要redolog

wal技术依赖 物理日志进行数据恢复,binlog是逻辑日志不是物理日志,因此无法使用,在恢复是无法单独保证数据的一致性。