B L A C K101-XA-引入xa_prepare_log_eventMySQL-5.7.7版本之后,通过引入xa_preapre_log_event,将完整的事务binlog日志一分为二,分别落盘,用来解决之前版本在客户端退出,或者服务器宕机的情况下,处于xa_prepared状态的事务丢失的情况。如下:
按照官方的说法就是很稳,可以放心使用。102-XA-Prepare持久化?
官方文笔:
MySQL-5.7.7版本及之后解决了xa_prepared状态的事务丢失的情况,出自官方用户手册,截图如下:
但是实际上,截止到MySQL-5.7.18版本,XA prepare命令返回后,处于xa_prepared状态的事务依然没有被持久化存储,也就是说,如果MySQL宕机,有可能导致数据的丢失,如下图所示。
Innodb跳过prepare阶段的事务日志持久化,其初衷也是为了binlog和redo可以同时进行组提交,但是给XA事务处理过程埋下了隐患。但是话又说回来,在半同步复制场景下,按照这个逻辑,即便master宕机了,只要slave还在,那么返回给客户端(或者是TM)XA prepare成功的事务,在slave实例中都是存在的。
103-XA-after_sync?
如果仔细阅读了MySQL-XA事务(二)源码实现,会发现在XA commit时的一个问题,如下图:
在提交一个处于recovery状态的XA事务时,无论半同步模式是after_sync还是after_commit, InnoDB中的事务提交操作,都被提前到了master实例接收ack之前,对比普通事务,XA事务开启after_sync模式已经失去了一半的意义,但在复制场景中,通过半同步复制来保证数据的最终一致性,还是非常可取的。
XA事务系列文章