mysql的两阶段提交

背景

先说背景,为什么要有两阶段提交?这里就要对mysql中的以下几个文件有所了解,undolog、redolog、binlog。undolog主要是在更新记录之前,存储更新前的值,方便回滚;redolog主要记录更新之后的值,如果mysql崩溃,可以从redolog中恢复数据;binlog主要用于主从之间同步,从库通过binlog同步主库的数据。

两阶段提交主要和redolog和binlog有关。一个更新的操作在mysql中主要分为以下几步:首先将更新记录所在的页加载到内存的buffer pool中,然后记录undolog,然后修改buffer pool中的值,最后提交修改记录(更新redolog和binlog)。

最后这步更新redolog和binlog有个问题,如果先写redolog,此时发生崩溃,服务器恢复之后可以从redolog中恢复修改后的数据,但是此时binlog没有记录,导致从库同步到了修改之前的数据,导致不一致;反之,如果先写binlog,此时发生崩溃,服务器恢复之后从库同步到了修改后的数据,但是主库由于没有redolog记录,只能恢复到修改之前的数据,也会产生不一致的问题。

因此,更新redolog和binlog需要进行两阶段提交,换而言之,两阶段提交就是为了解决redolog和binlog一致性的问题。

两阶段提交

如上图所示,两阶段提交的具体过程包括:prepare阶段写redolog,binlog落盘,coomit阶段更新redolog。使用两阶段提交的方式,无论数据库在哪个环节发生崩溃,都可以正确地恢复。补充说明redolog和binlog都会有一个唯一的XID来标记更新的事务,从而二者可以对齐。

情况一,在prepare阶段完成之后崩溃,由于binlog没有记录,因此直接回滚。

情况二,在binlog落盘后崩溃,检查事务是否完整无误,若是,直接提交即可,否则直接回滚。

情况三,在commit阶段完成后崩溃,同情况二。

可见,使用两阶段提交的方案,可以使mysql在发生故障后准确的识别到redolog和binlog所处的状态,从而采取正确的操作保证数据库的一致性。

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值