MySQL的SQL语句 -事务性语句和锁定语句(7)- XA 事务的限制

XA 事务的限制

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

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

对于 XA START,可以识别 JOIN 和 RESUME 子句,但不起作用。

对于 XA END,可以识别 SUSPEND [For MIGRATE] 子句,但不起作用。

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

XA 事务分两部分写入二进制日志。当执行 XA PREPARE 时,事务的第一部分(从事务开始直到 XA PREPARE)使用初始 GTID 写入。XA_prepare_log_event 用于标识二进制日志中的此类事务。当执行 XA COMMIT 或 XA ROLLBACK 时,将使用第二个 GTID 写入仅包含 XA COMMIT 或 XA ROLLBACK 语句的事务的第二部分。请注意,事务的初始部分(由 XA_prepare_log_event 标识)不一定后跟它的 XA COMMIT 或 XA ROLLBACK,这可能导致两个 XA 事务的二进制日志记录互相交错。XA 事务的两个部分甚至可以出现在不同的二进制日志文件中。这意味着在执行显式 XA COMMIT 或 XA ROLLBACK 语句之前,处于 PREPARED 状态的 XA 事务现在是持久的,以确保 XA 事务与复制兼容。

在副本上,XA 事务准备好后,它立即从复制应用程序线程分离,并且可以由副本上的任何线程提交或回滚。这意味着同一个 XA 事务可以在不同的线程上以不同的状态出现在 events_transactions_current 表中。events_transactions_current 表显示线程上最近监视的事务事件的当前状态,当线程空闲时不会更新此状态。因此,XA 事务在被另一个线程处理后,仍然可以在原始应用线程的 PREPARED 状态下显示。要确定仍处于 PREPARED 状态且需要恢复的 XA 事务,请使用 XA RECOVER 语句而不是 Performance Schema 事务表。

使用 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 事务后发生变化,并可能与复制事务上下文状态不一致。

每当 XA 事务受复制筛选器影响时,无论事务是否为空,都会记录错误 ER_XA_REPLICATION_FILTERS。如果事务不是空的,复制副本可以继续运行,但是应该采取步骤停止对 XA 事务使用复制过滤器,以避免潜在的问题。如果事务为空,复制副本将停止。在这种情况下,复制副本可能处于未确定的状态,在这种状态下,复制过程的一致性可能会受到影响。特别是,在副本的副本上执行的 gtid_executed 集合可能与源上的不一致。要解决此问题,请隔离源并停止所有复制,然后检查整个复制拓扑的 GTID 一致性。然后撤销 XA 事务的复制错误。然后重新开始复制。

● XA 事务对于基于语句的复制来说是不安全的。如果在源上并行提交的两个 XA 事务在副本上按相反的顺序准备,则可能会发生无法安全解析的锁定依赖,并且复制可能因为在副本上出现死锁会失败。对于单线程或多线程副本,可能会出现这种情况。设置 binlog_format=STATEMENT 时,会对 XA 事务中的 DML 语句发出警告。当设置 binlog_format=MIXED 或 binlog_format=ROW 时,XA 事务中的 DML 语句将使用基于行的复制进行记录,并且不存在潜在的问题。

官方网址:
https://dev.mysql.com/doc/refman/8.0/en/xa-restrictions.html

MySQL的SQL语句 -事务性语句和锁定语句(7)- XA 事务的限制

上一篇:MySQL的SQL语句 - 数据操作语句(17)- WITH 语句(3)


下一篇:MySQL的SQL语句 -事务性语句和锁定语句(2)- 导致隐式提交的语句