mysql事务持久化时宕机_MySQL-XA事务(三)改进与缺陷

ea39c3b74aa3e553fe0f64fd751c829f.pngB L A C K101-XA-引入xa_prepare_log_eventMySQL-5.7.7版本之后,通过引入xa_preapre_log_event,将完整的事务binlog日志一分为二,分别落盘,用来解决之前版本在客户端退出,或者服务器宕机的情况下,处于xa_prepared状态的事务丢失的情况。如下:

b58254b1c295a16fe2554dcafe66e08b.png

按照官方的说法就是很稳,可以放心使用。102-XA-Prepare持久化?

官方文笔:

MySQL-5.7.7版本及之后解决了xa_prepared状态的事务丢失的情况,出自官方用户手册,截图如下:

789d28e75312dadaba7393b930ec6e27.png

3f788c326559184042cbac04edfa8e7a.png

但是实际上,截止到MySQL-5.7.18版本,XA prepare命令返回后,处于xa_prepared状态的事务依然没有被持久化存储,也就是说,如果MySQL宕机,有可能导致数据的丢失,如下图所示。

6ac172032e977401eda1328e7d673f0d.png

Innodb跳过prepare阶段的事务日志持久化,其初衷也是为了binlog和redo可以同时进行组提交,但是给XA事务处理过程埋下了隐患。但是话又说回来,在半同步复制场景下,按照这个逻辑,即便master宕机了,只要slave还在,那么返回给客户端(或者是TM)XA prepare成功的事务,在slave实例中都是存在的。

103-XA-after_sync?

如果仔细阅读了MySQL-XA事务(二)源码实现,会发现在XA commit时的一个问题,如下图:

6ed9a8ea75591acde8cbeb36586947f3.png

在提交一个处于recovery状态的XA事务时,无论半同步模式是after_sync还是after_commit, InnoDB中的事务提交操作,都被提前到了master实例接收ack之前,对比普通事务,XA事务开启after_sync模式已经失去了一半的意义,但在复制场景中,通过半同步复制来保证数据的最终一致性,还是非常可取的。

XA事务系列文章

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值