什么是Mysql 两阶段提交?为什么必须有“两阶段提交”呢? 两阶段提交的原理? 解决 bin log 与 redo log 的一致性问题?


什么是两阶段提交

当有数据修改时,会先将修改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有记录,则恢复数据也不受影响

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值