支持 XA 事务可用于 InnoDB
存储引擎。MySQL 的 XA 实现基于 X/Open CAE 文档 分布式事务处理:XA 规范。该文档由 The Open Group 发布,位于 http://www.opengroup.org/public/pubs/catalog/c193.htm。当前 XA 实现的限制在 第 15.3.8.3 节,“XA 事务限制” 中描述。
在客户端,没有特殊要求。MySQL 服务器的 XA 接口由以 XA
关键字开头的 SQL 语句组成。MySQL 客户端程序必须能够发送 SQL 语句并理解 XA 语句接口的语义。它们不需要链接到最新的客户端库。较旧的客户端库也可以工作。
在 MySQL 连接器中,MySQL Connector/J 5.0.0 及更高版本直接支持 XA,通过一个处理 XA SQL 语句接口的类接口。
XA 支持分布式事务,即允许多个独立的事务资源参与全局事务。事务资源通常是 RDBMS,但也可以是其他类型的资源。
全局事务涉及多个事务操作,这些操作必须作为一个组全部成功或全部回滚。在本质上,这扩展了 ACID 属性,使多个 ACID 事务可以作为一个全局操作的组件执行,具有 ACID 属性。(与非分布式事务一样,SERIALIZABLE
可能是首选,如果您的应用程序对读现象敏感。REPEATABLE READ
可能不足以满足分布式事务。)
一些分布式事务的示例:
-
一个应用程序可能充当集成工具,结合消息服务与 RDBMS。该应用程序确保事务处理消息发送、检索和处理,同时也涉及事务数据库的全局事务。您可以将其视为 “事务电子邮件。”
-
一个应用程序执行涉及多个数据库服务器的操作,例如 MySQL 服务器和 Oracle 服务器(或多个 MySQL 服务器),其中涉及多个服务器的操作必须作为全局事务的一部分,而不是每个服务器的独立事务。
-
一家银行在 RDBMS 中存储账户信息,并通过自动柜员机(ATM)分配和接收钱款。需要确保 ATM 操作正确地反映在账户中,但这不能单独由 RDBMS 完成。一个全局事务管理器将 ATM 和数据库资源集成,以确保财务交易的一致性。
使用全局事务的应用程序涉及一个或多个资源管理器和事务管理器:
-
资源管理器(RM)提供事务资源的访问。数据库服务器是一种资源管理器。它必须能够提交或回滚由 RM 管理的事务。
-
事务管理器(TM)协调全局事务中的事务。它与处理每个事务的 RM 进行通信。全局事务中的个体事务是全局事务的 “分支”。全局事务和其分支由后面描述的命名方案标识。
MySQL 的 XA 实现使 MySQL 服务器能够充当资源管理器,处理全局事务中的 XA 事务。连接到 MySQL 服务器的客户端程序充当事务管理器。
要执行全局事务,需要知道哪些组件参与其中,并将每个组件带到可以提交或回滚的点。根据每个组件关于其成功能力的报告,它们必须作为原子组全部提交或回滚。也就是说,所有组件必须提交,或者所有组件必须回滚。要管理全局事务,需要考虑到任何组件或连接网络可能会失败。
执行全局事务的过程使用两阶段提交(2PC)。这发生在全局事务的分支执行动作之后。
-
在第一阶段,所有分支都被准备好了。也就是说,它们被事务管理器(TM)告知准备提交。通常,这意味着每个资源管理器(RM)记录分支的动作到稳定存储中。分支指示它们是否能够这样做,并且这些结果用于第二阶段。
-
在第二阶段,事务管理器告诉资源管理器是否提交或回滚。如果所有分支在准备时都指示它们能够提交,那么所有分支都被告知提交。如果任何分支在准备时指示它们不能提交,那么所有分支都被告知回滚。
在某些情况下,全局事务可能使用单阶段提交(1PC)。例如,当事务管理器发现全局事务仅包含一个事务资源(即单个分支)时,该资源可以被告知同时准备和提交。