15.3.8.1 XA 事务 SQL 语句
要在 MySQL 中执行 XA 事务,请使用以下语句:
XA {START|BEGIN} xid [JOIN|RESUME]
XA END xid [SUSPEND [FOR MIGRATE]]
XA PREPARE xid
XA COMMIT xid [ONE PHASE]
XA ROLLBACK xid
XA RECOVER [CONVERT XID]
对于XA START,JOIN 和 RESUME take no effect。
对于XA END,SUSPEND [FOR MIGRATE] take no effect。
每个 XA 语句都以 XA 关键字开始,且大多数需要一个 xid 值。一个 xid 是 XA 事务标识符,它指示语句应用于哪个事务。 xid 值由客户端提供或由 MySQL 服务器生成。一个 xid 值由一个到三个部分组成:
xid: gtrid [, bqual [, formatID ]]
gtrid 是全局事务标识符,bqual 是分支限定符,formatID 是一个标识符,用于标识 gtrid 和 bqual 值的格式。语法中,bqual 和 formatID 是可选的。默认的 bqual 值是 '',如果不提供。默认的 formatID 值是 1,如果不提供。
gtrid 和 bqual 必须是字符串字面量,每个不超过 64 字节(不是字符)长。 gtrid 和 bqual 可以以多种方式指定。您可以使用引号字符串('ab'),十六进制字符串(X'6162',0x6162),或位值(b')。nnnn'
formatID 是无符号整数。
MySQL 服务器的 underlying XA 支持子程序将 gtrid 和 bqual 值解释为字节。然而,在 SQL 语句包含 XA 语句时,服务器将在某个特定的字符集下工作。为了安全起见,请将 gtrid 和 bqual 写作十六进制字符串。
xid 值通常由事务管理器生成。由一个 TM 生成的值不能与由其他 TM 生成的值相同。给定 TM 必须能够识别自己的 xid 值在 XA RECOVER 语句返回的值列表中。
XA START 从给定的xidxid值开始一个XA事务。每个XA事务都必须有唯一的xid值,因此该值不能当前正在被另一个XA事务使用。唯一性是通过gtrid和bqual值来评估。所有后续的XA语句都必须使用与XA START语句中给定的xid值相同。如果你使用任何这些语句,但指定的xid值不对应于某个现有XA事务,会出现错误。
XA START、XA BEGIN、XA END、XA COMMIT和XA ROLLBACK语句不受默认数据库的过滤,当服务器运行时使用--replicate-do-db或--replicate-ignore-db选项。
一个或多个XA事务可以是同一个全局事务的一部分。所有XA事务都必须使用相同的gtrid值在xid值中。因此,gtrid值必须全球唯一,以避免对给定的XA事务的歧义。bqual部分的xid值必须在全局事务中的每个XA事务中不同。 (当前MySQL XA实现的限制是bqual值必须不同。这不是XA规范的一部分。)
XA RECOVER语句返回MySQL服务器上的XA事务的信息,这些事务当前处于PREPARED状态。 (见第15.3.8.2节,“XA事务状态”。)输出包括服务器上的每个XA事务的行,無论是哪个客户端启动的。
XA RECOVER需要XA_RECOVER_ADMIN权限。这项权限要求防止用户发现其他用户的XA事务XID值。它不影响XA事务的正常提交或回滚,因为启动该事务的用户知道其XID。
XA RECOVER输出行看起来像这样(对于一个示例xid值,包括'abc'、'def'和7):
mysql> XA RECOVER;
+----------+--------------+--------------+--------+
| formatID | gtrid_length | bqual_length | data |
+----------+--------------+--------------+--------+
| 7 | 3 | 3 | abcdef |
+----------+--------------+--------------+--------+
输出列具有以下含义:
-
formatID是事务xid的formatID部分 -
gtrid_length是xid的gtrid部分的字节长度 -
bqual_length是xid的bqual部分的字节长度 -
data是xid的gtrid和bqual部分的concatenation
XID 值可能包含不可打印字符。XA RECOVER 允许可选的 CONVERT XID 子句,以便客户端可以请求十六进制的XID值。