文章目录
什么是两阶段提交
当有数据修改时,会先将修改redo log cache和binlog cache然后在刷入到磁盘形成redo log file,当redo log file全都刷入到磁盘时(prepare 状态)和提交成功后才能将binlog cache刷入磁盘,当binlog全部刷新到磁盘后会记录一个xid,然后在relo log file上打上commit标志(commit阶段)
为什么必须有“两阶段提交”呢?
两阶段提交的原理?
解决 bin log 与 redo log 的一致性问题?
更新语句执行过程:
在没有两阶段提交的恢复情况下:
1、如果先redo log,后binlog,在 redo log 写完,binlog 还没时崩溃,恢复后主库数据被修改了,但 binlog 并没有该语句。因此从库会丢失该更新导致主从不一致
2、如果先binlog,后redo log,在binlog写完,redo log还没时崩溃,恢复后从库比主库多了一条更新,导致主从不一致
有了两阶段两阶段提交后的恢复情况:
1、redo 写入时崩溃,这时binlog也还没写入,恢复数据不受影响
2、redo写好了,binlog写入时崩溃,这时redo是prepare状态,还没有提交,恢复时事务会回滚,binlog也还没有记录,所以不会影响
3、redo写好了,binlog写好了,但是还没有commit时崩溃了,这时会判断对应事务的binlog是否存在并完整:
(1)如果存在并完整则提交事务,这时恢复到事务提交之后的状态,因为binlog中有记录,所以恢复成功
(2)如果binlog不存在或者不完整,会恢复到事务提交之前的状态,因为binlog中无记录或者不完整的记录不会生效,所以恢复也成功
4、redo已经有了commit标识,则直接提交事务,同时因为binlog有记录,则恢复数据也不受影响