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 START,可以识别JOIN
和RESUME
子句,但无效。
对于XA END,可以识别SUSPEND [FOR MIGRATE]
子句,但无效。
每个 XA 语句都以XA
关键字开头,并且大多数都需要* xid
*值。 * xid
*是 XA 事务标识符。它指示该语句适用于哪个事务。 * xid
*值由 Client 端提供,或由 MySQL 服务器生成。 * xid
*的值由一到三部分组成:
xid: gtrid [, bqual [, formatID ]]
-
gtrid
是全局事务标识符,bqual
是分支限定符,并且formatID
是标识gtrid
和bqual
值所使用的格式的数字。如语法所示,bqual
和formatID
是可选的。如果未指定,默认bqual
*值为''
。如果未指定,则默认值formatID
*为 1. -
gtrid
和bqual
*必须是字符串 Literals,每个字符串的长度最多为 64 个字节(不是字符)。 *gtrid
和bqual
*可以通过几种方式指定。您可以使用带引号的字符串('ab'
),十六进制字符串(X'6162'
,0x6162
)或位值(b'nnnn'
)。 -
formatID
*是无符号整数。 -
gtrid
和bqual
值由 MySQL 服务器的基础 XA 支持例程以字节为单位进行解释。但是,在解析包含 XA 语句的 SQL 语句时,服务器将使用某些特定的字符集。为了安全起见,将gtrid
和bqual
*写为十六进制字符串。 -
xid
值通常由事务 Management 器生成。一个 TM 生成的值必须不同于其他 TM 生成的值。给定的 TM 必须能够识别XA RECOVER语句返回的值列 table 中自己的xid
*值。
XA START xid使用给定的* xid
*值开始 XA 事务。每个 XA 事务必须具有唯一的_xid
值,因此该值当前不能被另一个 XA 事务使用。使用 gtrid
和 bqual
值评估唯一性。必须使用与XA START语句中给定的相同值 xid
*来指定用于 XA 事务的所有以下 XA 语句。如果使用这些语句中的任何一条,但是指定的xid
*值与某些现有 XA 事务不对应,则将发生错误。
一个或多个 XA 事务可以是同一全局事务的一部分。给定全局事务中的所有 XA 事务必须在* xid
值中使用相同的 gtrid
值。因此, gtrid
*值必须是全局唯一的,以使给定 XA 事务属于哪个全局事务没有歧义。 xid
值的 bqual
部分对于全局事务中的每个 XA 事务必须不同。 ( bqual
*值必须不同,这是当前 MySQL XA 实现的限制.它不是 XA 规范的一部分.)
XA RECOVER语句返回 MySQL 服务器上处于PREPARED
状态的 XA 事务的信息。 (请参阅第 13.3.7.2 节“ XA 事务状态”。)无论服务器是由哪个 Client 端启动的,输出都会为服务器上的每个此类 XA 事务包含一行。
XA RECOVER输出行看起来像这样(例如* xid
*由'abc'
,'def'
和7
组成的值):
mysql> XA RECOVER;
+----------+--------------+--------------+--------+
| formatID | gtrid_length | bqual_length | data |
+----------+--------------+--------------+--------+
| 7 | 3 | 3 | abcdef |
+----------+--------------+--------------+--------+
输出列具有以下含义:
-
formatID
是 Transaction 的*formatID
部分xid
* -
gtrid_length
是*xid
的gtrid
*部分的字节长度 -
bqual_length
是*xid
的bqual
*部分的字节长度 -
data
是*xid
的gtrid
和bqual
*部分的串联
XID 值可能包含不可打印的字符。从 MySQL 5.7.5 开始,XA RECOVER允许使用可选的CONVERT XID
子句,以便 Client 端可以请求十六进制的 XID 值。