InnoDB 存储引擎支持 XA 事务。MySQL XA 的实现基于 X/Open CAE 文档 Distributed Transaction Processing: The XA Specification。文件网址为 http://www.opengroup.org/public/pubs/catalog/c193.htm。
在客户端,没有特殊要求。MySQL 服务器的 XA 接口由以 XA 关键字开头的 SQL 语句组成。MySQL 客户端程序必须能够发送 SQL 语句并理解 XA 语句接口的语义。它们不需要与最新的客户端库链接。旧的客户端库也可以使用。
在 MySQL 连接器中,MySQL Connector/J 5.0.0 及更高版本,通过处理 XA SQL 语句接口的类接口直接支持 XA。
XA 支持分布式事务,即允许多个独立事务资源参与全局事务的能力。事务性资源通常是 RDBMS,但也可能是其他类型的资源。
全局事务涉及多个本身是事务性的操作,但所有这些操作要么作为一组成功完成,要么作为一组回滚。本质上,这将 ACID 属性扩展到“上一个级别”,以便可以将多个 ACID 事务作为同样具有 ACID 属性的全局操作的组件一起执行。(与非分布式事务一样,如果应用程序侧重读取,则 SERIALIZABLE 可能是首选。对于分布式事务,REPEATABLE READ 可能效率不足。)
一些分布式事务的示例:
● 应用程序可以作为集成工具,将消息传递服务与 RDBMS 结合在一起。应用程序确保处理消息发送、检索和涉及到事务数据库的处理,这些事务都发生在全局事务中。你可以把它想象成“事务性电子邮件”。
● 应用程序执行的操作涉及不同的数据库服务器,例如 MySQL 服务器和 Oracle 服务器(或多个 MySQL 服务器),其中涉及多个服务器的操作必须作为全局事务的一部分发生,而不是作为每个服务器本地的单独事务。
● 银行将帐户信息保存在关系数据库中,并通过自动柜员机(ATM)分发和接收资金。必须确保 ATM 操作正确地反映在帐户中,但这不能仅用 RDBMS 来实现。全局事务管理器整合 ATM 和数据库资源,以确保金融交易的整体一致性。
使用全局事务的应用程序包含一个或多个资源管理器和一个事务管理器:
● 资源管理器(RM)提供对事务性资源的访问。数据库服务器是一种资源管理器。必须能够提交或回滚由RM管理的事务。
● 事务管理器(TM)协调全局事务的一部分事务。它与处理事务的 RM 通信。全局事务中的单个事务是全局事务的“分支”。全局事务及其分支由后面描述的命名方案标识。
XA 的 MySQL 实现使 MySQL 服务器能够充当资源管理器,在全局事务中处理 XA 事务。连接到 MySQL 服务器的客户端程序充当事务管理器。
要执行全局事务,必须知道涉及哪些组件,并将每个组件置于可以提交或回滚的位置。基于每个组件报告的结果,它们必须作为一个原子组提交或回滚。也就是说,要么所有组件都必须提交,要么所有组件都必须回滚。要管理全局事务,必须考虑到任何组件或连接网络可能发生故障。
执行全局事务的流程使用两阶段提交(2PC)。这在全局事务的分支执行操作之后发生。
● 在第一阶段,所有分支都准备就绪。也就是说,他们被 TM 告知要准备提交。通常,这意味着管理分支的每个 RM 在稳定存储中记录该分支的操作。分支表明它们是否能够做到这一点,这些结果将用于第二阶段。
● 在第二阶段,TM 告诉 RM 是提交还是回滚。如果所有分支都表示它们准备就绪时能够提交,则所有分支都被告知提交。如果任何分支在准备时表示无法提交,则所有分支都被告知回滚。
在某些情况下,全局事务可能使用单阶段提交(1PC)。例如,当事务管理器发现全局事务只包含一个事务资源(即单个分支)时,可以告知该资源同时准备和提交。