什么是两阶段提交?RedoLog和BinLog是如何配合工作的?
什么是两阶段提交?RedoLog和BinLog是如何配合工作的?
提示
题眼: 两阶段提交,保证事务的持久性
两阶段提交是分布式系统中比较常见的一种事务提交算法。在Innodb的日志提交时用到了这个协议,用来保证事务提交时,redolog和binlog 都处于完成状态。正常情况:
- 操作完更新语句,把数据保存到内存
- 写入RedoLog,处于prepare阶段
- 写入BinLog
- 提交事务,BinLog和RedoLog都处于完成状态。
崩溃恢复的时候,会按顺序扫描 RedoLog:
- 如果碰到既有 prepare、又有 commit 的 RedoLog,就直接提交;
- 如果碰到只有 prepare、而没有 commit 的RedoLog,就拿着 XID 去BinLog 找对应的事务。
重要
参考答案:
MySQL的Innodb引擎会使用Redolog和Binlog这两种日志搭配使用来保证事务的持久化,其中Binlog记录的是执行的SQL记录,Redolog记录的是对数据的更改。然后,它使用两阶段协议来保证日志的提交。比如说,当我们更新一条记录,然后MySQL会把记录更新到缓存,然后写入日志,也就是WAL机制。这个时候因为是两个日志,需要让两个日志都写入成功才算结束。
MySQL先写RedoLog,然后使其处于prepare,也就是预提交阶段,然后写如Binlog,最后提交事务,此时两个日志都是完整的状态。如果出现意外情况,导致两个日志不一样,那么无外乎三种情况。
第一种,两个日志都没写入,那这个事务就是失败的,直接抛弃掉。第二种,一个有一个没有,那就认为这个事务时残缺的,当作失败处理。第三种,比较复杂。如果两个都有完整的commit,那这个事务已经是正常的事务了;如果有redolog是残缺的,缺少了commit,此时拿着事务ID去查Binlog,如果binlog正常,那么这个事务就按正常处理。
相关信息
引申:单独一个日志,为什么没法保证事务持久化?
