要在 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
是一个无符号整数。
MySQL 服务器底层的 XA 支持例程会将 gtrid
和 bqual
值解释为字节。但是,在解析包含 XA 语句的 SQL 语句时,服务器会使用一些特定的字符集。为了安全起见,请将 gtrid
和 bqual
写成十六进制字符串。
xid
值通常由事务管理器生成。一个 TM 生成的值必须与其他 TM 生成的值不同。给定的 TM 必须能够在 XA RECOVER
语句返回的值列表中识别出自己的 xid
值。
XA START
使用给定的 xid
xid
值启动 XA 事务。每个 XA 事务必须具有唯一的 xid
值,因此该值当前不能被另一个 XA 事务使用。唯一性是使用 gtrid
和 bqual
值评估的。XA 事务的所有后续 XA 语句必须使用与 XA START
语句中给出的相同的 xid
值指定。如果使用任何这些语句,但指定的 xid
值与某个现有 XA 事务不对应,则会发生错误。
当服务器使用 --replicate-do-db
或 --replicate-ignore-db
运行时,XA START
、XA BEGIN
、XA END
、XA COMMIT
和 XA ROLLBACK
语句不会被默认数据库过滤。
一个或多个 XA 事务可以是同一个全局事务的一部分。给定全局事务中的所有 XA 事务必须在 xid
值中使用相同的 gtrid
值。因此,gtrid
值必须是全局唯一的,以便明确给定 XA 事务是哪个全局事务的一部分。xid
值的 bqual
部分对于全局事务中的每个 XA 事务必须不同。(bqual
值必须不同的要求是当前 MySQL XA 实现的限制。它不是 XA 规范的一部分。)
XA RECOVER
语句返回 MySQL 服务器上处于 PREPARED
状态的 XA 事务的信息。(请参阅第 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
部分的串联
XID 值可能包含不可打印字符。XA RECOVER
允许使用可选的 CONVERT XID
子句,以便客户端可以请求十六进制的 XID 值。