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
从给定的xid
xid
值开始一个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值。