要在 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
子句被识别,但没有效果。
对于 XA END
,SUSPEND [FOR MIGRATE]
子句被识别,但没有效果。
每个 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
是一个无符号整数。
gtrid
和 bqual
值由 MySQL 服务器的底层 XA 支持例程解释。但是,当 SQL 语句包含 XA 语句时,服务器使用特定的字符集。为安全起见,请将 gtrid
和 bqual
写为十六进制字符串。
xid
值通常由事务管理器生成。由一个 TM 生成的值必须不同于其他 TM 生成的值。给定的 TM 必须能够在 XA RECOVER
语句返回的值列表中识别自己的 xid
值。
XA START
启动一个 XA 事务,使用给定的 xid
xid
值。每个 XA 事务必须具有唯一的 xid
值,因此该值不能当前被另一个 XA 事务使用。唯一性是使用 gtrid
和 bqual
值评估的。所有后续 XA 语句对于 XA 事务必须指定相同的 xid
值,如在 XA START
语句中给定的那样。如果您使用这些语句,但指定了不对应于某个现有 XA 事务的 xid
值,将发生错误。
XA START
、XA BEGIN
、XA END
、XA COMMIT
和 XA ROLLBACK
语句不受默认数据库的过滤,当服务器以 --replicate-do-db
或 --replicate-ignore-db
运行时。
一个或多个XA事务可以是同一个全局事务的一部分。同一个全局事务中的所有XA事务必须在gtrid
值。因此,
gtrid
值必须是全球唯一的,以便不会对给定XA事务所属的全局事务产生歧义。
bqual
部分
bqual
值必须不同的要求不是XA规范的一部分。)
XA RECOVER
语句返回MySQL服务器上处于
XA RECOVER
需要XA_RECOVER_ADMIN
权限。该权限要求防止用户发现其他人的未提交XA事务的XID值,而不影响正常的XA事务提交或回滚,因为启动它的用户知道其XID。
XA RECOVER
输出行看起来像这样(对于一个示例
mysql> XA RECOVER;
+----------+--------------+--------------+--------+
| formatID | gtrid_length | bqual_length | data |
+----------+--------------+--------------+--------+
| 7 | 3 | 3 | abcdef |
+----------+--------------+--------------+--------+
输出列的含义如下:
-
formatID
是事务的 formatID
部分 -
gtrid_length
是的 gtrid
部分的字节长度 -
bqual_length
是的 bqual
部分的字节长度 -
data
是的 gtrid
和bqual
部分的连接
XID值可能包含不可打印的字符。XA RECOVER
允许可选的CONVERT XID
子句,以便客户端可以请求十六进制形式的XID值。