要在 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
值有 1 到 3 部分
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 事务都不对应,则会发生错误。
XA START
、XA BEGIN
、XA END
、XA COMMIT
和 XA ROLLBACK
语句不会被默认数据库过滤,前提是服务器在运行时使用 --replicate-do-db
或 --replicate-ignore-db
。
一个或多个 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
输出行看起来像这样(对于一个包含部分 'abc'
、'def'
和 7
的示例 xid
值)
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 值。