谈一下MySQL的两阶段提交机制

为什么需要两阶段提交?

为了保证事务的持久性和一致性,MySQL需要确保redo log和binlog的同步持久化。MySQL通过“两阶段提交”的机制来实现在事务提交时,这两个日志必须保持一致,以避免出现数据不一致的问题。

为什么会出现日志不一样的这种情况?

因为事务提交后,redo log 和 binlog 都要持久化到磁盘,但是这两个是独立的逻辑,可能出现半成功的状态。
即,有可能redo持久化了,但是binlog没持久化;或者是redo没有持久化成功,而binlog持久化成功了。这样就会导致它们两个日志的不一致性。
而我们通过“两阶段提交”的机制来保证日志一致的问题。

两阶段提交流程?

  1. 准备阶段(Prepare)
        在事务执行过程中,所有的数据更改都会先记录到InnoDB存储引擎的redo log中,此时事务处于prepare阶段。此阶段确保了即使发生崩溃,更改也能通过redo log进行恢复。
        在准备阶段结束时,InnoDB会生成一个唯一的事务ID(XID)。InnoDB会将一个包含此XID和事务状态的特殊标记记录写入redo log,并将redo log标记为prepare状态。
  2. 写入binlog
        事务的所有更改都会记录到binlog中,然后记录一个包含XID的COMMIT事件。
  3. 写binlog到磁盘
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值