暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

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

数据库杂货铺 2021-04-12
391
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 PREPAREXA COMMITXA 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=TABLEMySQL 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
 

文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论