Documentation Home

13.3.7.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 STARTJOINRESUME子句被识别但没有效果。

因为XA ENDSUSPEND [FOR MIGRATE] 条款被承认但没有效力。

每个 XA 语句都以XA关键字开头,其中大多数都需要一个xid 值。Anxid是 XA 事务标识符。它指示语句适用于哪个事务。xid值由客户端提供,或由 MySQL 服务器生成。一个 xid值由一到三个部分组成:

xid: gtrid [, bqual [, formatID ]]

gtrid是全局事务标识符,bqual是分支限定符,formatID是标识 gtridbqual值使用的格式的数字。如语法所示,bqual并且 formatID是可选的。 如果没有给出默认 bqual值。''如果未给出,则默认formatID 值为 1。

gtrid并且 bqual必须是字符串文字,每个最多 64 个字节(不是字符)长。 gtrid并且 bqual可以通过多种方式指定。您可以使用带引号的字符串 ( 'ab')、十六进制字符串 ( X'6162', 0x6162) 或位值 ( )。 b'nnnn'

formatID是无符号整数。

和值由 MySQL 服务器的底层 XA 支持例程以字节为单位进行解释gtridbqual但是,在解析包含 XA 语句的 SQL 语句时,服务器会使用某些特定的字符集。为了安全起见,将gtridand bqual写成十六进制字符串。

xid值通常由事务管理器生成。一个 TM 生成的值必须不同于其他 TM 生成的值。给定的 TM 必须能够在语句 xid返回的值列表中 识别自己的值。XA RECOVER

XA START xidxid使用给定值启动 XA 事务。每个 XA 事务都必须有一个唯一的 xid值,因此该值当前不能被另一个 XA 事务使用。gtrid使用和 bqual值评估唯一性。XA 事务的所有后续 XA 语句必须使用与语句xid中给定的值 相同的值来指定XA START。如果您使用这些语句中的任何一个,但指定的xid值与某些现有 XA 事务不对应,则会发生错误。

一个或多个 XA 事务可以是同一全局事务的一部分。给定全局事务中的所有 XA 事务必须在gtrid 值中使用相同的xid值。出于这个原因,gtrid值必须是全局唯一的,这样就不会出现给定 XA 事务属于哪个全局事务的歧义。对于全局事务中的每个 XA 事务,值的 bqual一部分 xid必须不同。(bqual值不同的要求是当前 MySQL XA 实现的限制。它不是 XA 规范的一部分。)

XA RECOVER语句返回 MySQL 服务器上处于该 PREPARED状态的那些 XA 事务的信息。(请参阅 第 13.3.7.2 节,“XA 事务状态”。)输出包括服务器上每个此类 XA 事务的一行,无论哪个客户端启动它。

XA RECOVER输出行如下所示(对于 xid由部分 'abc''def'和 组成的示例值7):

mysql> XA RECOVER;
+----------+--------------+--------------+--------+
| formatID | gtrid_length | bqual_length | data   |
+----------+--------------+--------------+--------+
|        7 |            3 |            3 | abcdef |
+----------+--------------+--------------+--------+

输出列具有以下含义:

  • formatIDformatID交易的一部分 xid

  • gtrid_lengthgtrid部分的 字节长度xid

  • bqual_lengthbqual部分的 字节长度xid

  • data是的 gtridbqual部分的 串联xid

XID 值可能包含不可打印的字符。从 MySQL 5.7.5 开始,XA RECOVER允许一个可选的CONVERT XID子句,以便客户端可以请求十六进制的 XID 值。