### 13.3.8 XA 交易

[13.3.8.1 XA 事务 SQL 语句](xa-statements.html)
[13.3.8.2 XA 事务状态](xa-states.html)
[13.3.8.3 XA 事务的限制](xa-restrictions.html)

[](<>)

支持[XA](glossary.html#glos_xa)交易可用于[`InnoDB`](innodb-storage-engine.html)存储引擎。MySQL XA 实现基于 X/Open CAE 文档*分布式事务处理：XA 规范*.本文档由 The Open Group 发布，可在<http://www.opengroup.org/public/pubs/catalog/c193.htm>.当前 XA 实现的限制在[第 13.3.8.3 节，“XA 交易的限制”](xa-restrictions.html).

在客户端，没有特殊要求。MySQL 服务器的 XA 接口由以`XA`关键词。MySQL 客户端程序必须能够发送 SQL 语句并理解 XA 语句接口的语义。它们不需要链接到最近的客户端库。较旧的客户端库也可以使用。

在 MySQL 连接器中，MySQL Connector/J 5.0.0 及更高版本通过为您处理 XA SQL 语句接口的类接口直接支持 XA。

XA支持分布式事务，即允许多个单独的事务资源参与全局事务的能力。事务性资源通常是RDBMS，但也可能是其他类型的资源。

一个全局事务涉及几个本身是事务性的操作，但所有操作要么作为一个组成功完成，要么作为一个组回滚。本质上，这将ACID属性“扩展到了一个级别”，以便多个ACID事务可以作为也具有ACID属性的全局操作的组件协同执行。（与非分配交易一样，[`可序列化`](innodb-transaction-isolation-levels.html#isolevel_serializable)如果您的应用程序对读取现象敏感，则可能是首选。[`可重复读取`](innodb-transaction-isolation-levels.html#isolevel_repeatable-read)可能不足以进行分布式事务。）

分布式事务的一些示例：

-   应用程序可以充当集成工具，将消息传递服务与RDBMS结合起来。该应用程序确保处理消息发送、检索和处理的事务（也涉及事务数据库）都发生在全局事务中。你可以将其视为“事务性电子邮件”

-   应用程序执行涉及不同数据库服务器的操作，例如MySQL服务器和Oracle服务器（或多个MySQL服务器），其中涉及多个服务器的操作必须作为全局事务的一部分发生，而不是作为每个服务器本地的单独事务发生。

-   银行将账户信息保存在RDBMS中，并通过自动取款机（ATM）分配和接收资金。有必要确保ATM操作正确地反映在账户中，但这不能仅用RDBMS来实现。全球交易管理器集成ATM和数据库资源，以确保金融交易的整体一致性。

    使用全局事务的应用程序涉及一个或多个资源管理器和一个事务管理器：

-   资源管理器（RM）提供对事务性资源的访问。数据库服务器是一种资源管理器。必须能够提交或回滚由RM管理的事务。

-   事务管理器（TM）协调属于全局事务的事务。它与处理这些事务的RM进行通信。全局事务中的单个事务是全局事务的“分支”。全局事务及其分支由后面描述的命名方案标识。

    XA的MySQL实现使MySQL服务器能够充当资源管理器，在全局事务中处理XA事务。连接到MySQL服务器的客户端程序充当事务管理器。

    要执行全局事务，需要知道涉及哪些组件，并将每个组件带到可以提交或回滚的位置。根据每个组件对其成功能力的报告，它们都必须作为一个原子组提交或回滚。也就是说，要么所有组件都必须提交，要么所有组件都必须回滚。要管理全局事务，必须考虑任何组件或连接网络可能会出现故障。

    执行全局事务的过程使用两阶段提交（2PC）。这发生在全局事务分支执行操作之后。

1.  在第一阶段，所有分支都已准备就绪。也就是说，TM会告诉他们准备好做出承诺。通常，这意味着管理分支的每个RM都会在稳定存储中记录分支的操作。这些分支表示它们是否能够做到这一点，这些结果将用于第二阶段。

2.  在第二阶段，TM告诉RMs是提交还是回滚。如果所有分支在准备时都表示能够提交，则所有分支都会被告知提交。如果任何分支在准备时表示无法提交，则所有分支都会被告知回滚。

    在某些情况下，全局事务可能使用单阶段提交（1PC）。例如，当事务管理器发现一个全局事务只包含一个事务资源（即单个分支）时，可以告诉该资源同时准备和提交。
