存储引擎
支持XA事务。InnoDB
MySQL XA 实现基于 X/Open CAE 文档分布式事务处理:XA 规范。本文档由 The Open Group 发布,可从
http://www.opengroup.org/public/pubs/catalog/c193.htm 获取。当前 XA 实现的
限制在第 13.3.7.3 节,“XA 事务的限制”中描述。
在客户端,没有特殊要求。XA
MySQL 服务器的 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 通信。全局事务中的各个事务是全局事务的 “分支”。全局事务及其分支由稍后描述的命名方案标识。
XA 的 MySQL 实现使 MySQL 服务器能够充当资源管理器,在全局事务中处理 XA 事务。连接到 MySQL 服务器的客户端程序充当事务管理器。
要执行全局事务,需要知道涉及哪些组件,并将每个组件带到可以提交或回滚的点。根据每个组件报告其成功能力的内容,它们必须作为一个原子组全部提交或回滚。也就是说,要么所有组件都必须提交,要么所有组件都必须回滚。要管理全局事务,有必要考虑到任何组件或连接网络都可能发生故障。
执行全局事务的过程使用两阶段提交 (2PC)。这发生在全局事务的分支执行的操作已经执行之后。
在第一阶段,所有分支都准备好了。也就是说,他们被 TM 告知准备提交。通常,这意味着管理分支的每个 RM 都会在稳定存储中记录分支的操作。分支机构表明他们是否能够做到这一点,这些结果用于第二阶段。
在第二阶段,TM 告诉 RM 是提交还是回滚。如果所有分支在准备就绪时都表示可以提交,则所有分支都被告知提交。如果任何分支在准备时指示它无法提交,则告知所有分支回滚。
在某些情况下,全局事务可能使用单阶段提交 (1PC)。例如,当事务管理器发现全局事务仅由一个事务资源(即单个分支)组成时,可以通知该资源同时准备和提交。