MySQL的二阶段提交

61 阅读1分钟

简述

在更新过程中,为了保证binlog和redolog一致性的一种手段。因为在buffer pool还没刷新到磁盘时系统崩溃了,就可以基于redolog来恢复数据。

两个阶段同时完成的才将事务提交,保证binlog和redolog一致性。

过程

  1. 预提交阶段,调用write将redolog写到磁盘(事实上是写入到了磁盘缓冲区)

  2. 调用write()将binlog写入文件缓冲区,通过fsync()强制刷入磁盘

  3. commit阶段,fsync将redolog刷入磁盘,保证redolog和binlog的一致性

数据库如何判断binlog和redolog达成了一致?

prepare阶段中会在redolog中记录一个XID,这是全局唯一的

row格式的binlog中也会有一个XID

只要两个redolog和binlog中的XID一致,那么两个日志逻辑上就是一致的