MySQL事务和锁09

  官网地址:MySQL :: MySQL 5.7 Reference Manual :: 13.3.7.3 Restrictions on XA Transactions

欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯.

Mysql5.7参考手册  /  ...  /  对航空航天器交易的限制
13.3.7.3对XA 交易的限制

XA交易支持仅限于 InnoDB 存储引擎。

为了 “ external XA, ” mysql服务器充当资源管理器,客户端程序充当事务管理器。用于 “ 内部的 ” ,mysql服务器中的存储引擎充当RMS,服务器本身充当Tm。内部xa支持受到单个存储引擎能力的限制。处理涉及多个存储引擎的数据交换事务时,需要使用内部的数据交换机。实现内部xa要求存储引擎支持在表处理程序级别进行两阶段提交,目前这仅适用于:InnoDB .

为了XA START ……JOIN 和 RESUME 条款得到承认,但没有效果。

为了XA END …SUSPEND [FOR MIGRATE] 条款得到承认,但没有效果。

的要求bqual 一部分xid 全局事务中的每一个xa事务的值是不同的,这是当前mysqxa实现的一个限制。它不属于xa规范的一部分。

在mysql5.7.7之前,xa事务与复制不兼容。这是因为一个位于 PREPARED 将在干净的服务器关闭或客户机断开时回滚状态。类似地,一个位于PREPARED 国家仍然存在于PREPARED 如果服务器异常关闭,然后再次启动,则状态下,事务的内容无法写入二进制日志。在这两种情况下,都无法正确地复制xd事务。

在mysql5.7.7及以后,行为发生了变化,并将一个xd事务两部分写入二进制日志。何时 XA PREPARE 已签发,交易的第一部分直至XA PREPARE 是用一个初始的Gtid写的。AXA_prepare_log_event 用于在二进制日志中识别此类事务。何时 XA COMMIT 或XA ROLLBACK 已签发,交易的第二部分仅载有 XA COMMIT 或XA ROLLBACK 陈述是用第二个Gtid编写的。请注意,交易的最初部分 XA_prepare_log_event ,不一定跟着它XA COMMIT 或XA ROLLBACK ,这可能导致任何两个x事务的交叉二进制日志记录。甚至可以在不同的二进制日志文件中显示xd事务的两个部分。这意味着一个xd事务PREPARED 现在状态一直持续到XA COMMIT 或 XA ROLLBACK 发布声明,以确保XML事务与复制兼容。

在一个副本上,在编写了xa事务之后,它就会从副本贴花线程中分离出来,并且可以由副本上的任何线程提交或回滚。这意味着相同的xd事务可以出现在 events_transactions_current 不同线程上具有不同状态的表。… events_transactions_current 表显示线程上最近监测的事务事件的当前状态,在线程闲置时不更新此状态。因此,仍可以在PREPARED 在另一个线程处理后,对原来的贴补线程进行状态。正确识别仍在PREPARED 必须恢复,使用XA RECOVER 语句而不是性能架构事务表.

在mysq5.7.7及以后的版本中,对使用xd事务存在以下限制:

  • XA事务不能完全适应二进制日志的意外停止。如果服务器在执行一个XA PREPARE ,XA COMMIT ,XA ROLLBACK ,或 XA COMMIT ... ONE PHASE 语句,服务器可能无法恢复到正确的状态,使服务器和二进制日志处于不一致的状态。在这种情况下,二进制日志可能包含额外的未应用的x事务,或者是未应用的x事务。另外,如果在恢复后启用了GTDS @@GLOBAL.GTID_EXECUTED 可能无法正确描述所应用的事务。注意,如果在此之前突然停止XA PREPARE ,介于XA PREPARE 和 XA COMMIT (或XA ROLLBACK ),或之后XA COMMIT (或XA ROLLBACK ),服务器和二进制日志被正确地恢复到一致的状态。

  • 不支持使用复制滤波器或二进制日志滤波器结合fd事务。对表的过滤可能会导致在副本上对一个DB2事务进行空处理,并且不支持空的DB2事务。另外,在设置上 master_info_repository=TABLE 和 relay_log_info_repository=TABLE 在一个副本上,数据引擎事务的内部状态在经过筛选的xd事务之后改变,并且可能与复制事务的上下文状态不一致。

    错误 ER_XA_REPLICATION_FILTERS 无论事务是否为空的,只要在复制过滤器的影响下,就会记录该事务。如果事务不是空的,那么副本就可以继续运行,但是您应该采取步骤停止使用使用使用xd事务的复制过滤器,以避免潜在的问题。如果事务是空的,则复制将停止。在这种情况下,副本可能处于一个未确定的状态,其中复制过程的一致性可能受到损害。尤其是,gtid_executed设置在副本的副本上可能与源文件上的不一致。要解决这种情况,隔离源代码并停止所有复制,然后检查跨复制拓扑的Gtid一致性。撤销生成错误消息的xd事务,然后重新启动复制。

  • 在我的5.7.19之前,FLUSH TABLES WITH READ LOCK 是不兼容的。

  • XA事务被认为对基于声明的复制不安全。如果源代码上并行提交的两个xd事务正按相反顺序在副本上进行准备,则可能会发生无法安全解决的锁定依赖关系,而且复制可能会在副本上出现死锁。这种情况可能发生在单线程或多线程副本中。何时 binlog_format=STATEMENT 设置后,会对在xd事务中的dML语句发出警告。何时 binlog_format=MIXED 或 binlog_format=ROW 在设置时,使用基于行的复制来记录xl事务中的dml语句,而潜在的问题并不存在。

你可能感兴趣的:(mysql,数据库)