对 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 都会将分支的操作记录在稳定存储中。分支指示它们是否能够做到这一点,并且这些结果用于第二阶段。
在第二阶段,TM 告诉 RM 是提交还是回滚。如果所有分支在准备就绪时都表示它们能够提交,则会通知所有分支提交。如果任何分支在准备就绪时表示它无法提交,则会通知所有分支回滚。
在某些情况下,全局事务可以使用一阶段提交 (1PC)。例如,当事务管理器发现全局事务仅包含一个事务性资源(即单个分支)时,可以告诉该资源同时准备和提交。