XA事务支持仅限于 InnoDB存储引擎。

对于“ 外部XA ”,MySQL服务器充当资源管理器,而客户端程序充当事务管理器。对于“ 内部XA ”,MySQL服务器中的存储引擎充当RM,而服务器本身充当TM。内部XA支持受单个存储引擎功能的限制。需要内部XA来处理涉及多个存储引擎的XA事务。内部XA的实现要求存储引擎在表处理程序级别支持两阶段提交,并且目前仅对InnoDB。

对于XA START,JOIN和 RESUME子句可以识别,但无效。

对于XA END该SUSPEND [FOR MIGRATE] 子句是公认的,但无效。

对于全局事务中的每个XA事务bqual,xid值的部分必须不同的要求是当前MySQL XA实现的限制。它不是XA规范的一部分。

XA事务分为两部分写入二进制日志。当XA PREPARE 发出后,该事务的第一部分到XA PREPARE被使用初始GTID写入。A XA_prepare_log_event 用于在二进制日志中标识此类事务。当 XA COMMIT或XA ROLLBACK 发出后,交易的第二部分仅包含 XA COMMIT或XA ROLLBACK 语句使用第二GTID写入。请注意,交易的初始部分(由标识 XA_prepare_log_event)不一定要紧跟其XA COMMIT或XA ROLLBACK,这可能会导致任意两个XA事务的交错二进制日志记录。XA事务的两个部分甚至可以出现在不同的二进制日志文件中。这意味着处于PREPARED状态的XA事务现在将一直保持不变,直到发出显式XA COMMIT或 XA ROLLBACK语句为止,从而确保XA事务与复制兼容。

在复制从属服务器上,准备好XA事务后,它立即与从属服务器应用程序线程分离,并且可以由该从属服务器上的任何线程提交或回滚。这意味着同一XA事务可以events_transactions_current在不同线程上以不同状态出现在 表中。该 events_transactions_current表显示线程上最近监视的事务事件的当前状态,并且在线程空闲时不更新此状态。因此,XA事务在PREPARED被另一个线程处理后,仍可以在原始应用程序线程的状态下显示。为了明确识别仍在交易中的XA交易PREPARED状态并需要恢复,请使用该XA RECOVER语句而不是性能模式事务表。

使用XA事务存在以下限制:

XA事务不能完全抵抗二进制日志的意外中断。如果有意外的停顿,而服务器是在执行的中间XA PREPARE,XA COMMIT,XA ROLLBACK,或 XA COMMIT ... ONE PHASE语句时,服务器可能无法恢复到正确的状态,使服务器和二进制日志中的不一致的状态。在这种情况下,二进制日志可能包含未应用的额外XA事务,或者错过了已应用的XA事务。另外,如果启用了GTID,则恢复后 @@GLOBAL.GTID_EXECUTED可能无法正确描述已应用的事务。需要注意的是,如果之前发生意外停止XA PREPARE,之间XA PREPARE和 XA COMMIT(或XA ROLLBACK),或之后XA COMMIT (或者XA ROLLBACK),服务器和二进制日志被正确地恢复,并采取一致的状态。

不支持将复制过滤器或二进制日志过滤器与XA事务结合使用。表的筛选可能会导致XA事务在复制从属服务器上为空,并且不支持空的XA事务。同样,使用设置 master_info_repository=TABLE 和 relay_log_info_repository=TABLE 复制从属服务器(在MySQL 8.0中已成为默认设置),数据引擎事务的内部状态会在经过筛选的XA事务后发生更改,并且可能与复制事务上下文状态不一致。

ER_XA_REPLICATION_FILTERS每当XA事务受复制筛选器影响时,无论该事务是否为空,都会记录 该错误 。如果事务不为空,则复制从属服务器可以继续运行,但是您应该采取步骤中止对XA事务使用复制筛选器,以避免潜在的问题。如果事务为空,复制从站将停止。在这种情况下,复制从设备可能处于不确定状态,在该状态下复制过程的一致性可能会受到影响。特别是 gtid_executed从机上的从机设置可能与主机上的设置不一致。要解决这种情况,请隔离主服务器并停止所有复制,然后检查整个复制拓扑中的GTID一致性。撤消生成错误消息的XA事务,然后重新启动复制。

对于基于语句的复制,XA事务被认为是不安全的。如果在主机上以相反的顺序准备在主机上并行提交的两个XA事务,则会发生无法安全解决的锁定依赖关系,并且复制可能会因从机上的死锁而失败。对于单线程或多线程复制从属,可能会发生这种情况。当 binlog_format=STATEMENT设置,则会发出警告XA事务的内部DML语句。当 binlog_format=MIXED或 binlog_format=ROW设置,XA事务内的DML语句使用基于行的复制记录,以及潜在的问题是不存在的。

注意

在MySQL 5.7.7之前,XA事务与复制根本不兼容。这是因为处于PREPARED状态的XA事务将在干净服务器关闭或客户端断开连接时回滚。类似地,如果服务器异常关闭然后再次启动,则处于PREPARED状态的XA事务将仍然存在PREPARED,但是该事务的内容无法写入二进制日志。在这两种情况下,都无法正确复制XA事务。