ITEEDU

13.4.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

对于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值是''。如果没有给定,默认的fromatID值是1。

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

formatID是一个无符号的整数。

通过MySQL服务器的带下划线的XA支持子程序,gtrid和bqual值被理解为以字节为单位。但是,在包含XA语句的SQL语句正在被分析的同时,服务器会去操作一些特定的字符集。为了安全,把gtrid和bqual作为十六进制字符串写入。

通常,xid值由事务管理器生成。由一个TM生成的值必须与由其它TMs生成的值不同。一个给定的TM必须能识别自己的xid值。这些值位于由XA RECOVER语句返回的值清单中。

XA START xid用于启动一个带给定xid值的XA事务。每个XA事务必须有一个唯一的xid值,因此该值当前不能被其它的XA事务使用。使用gtrid和bqual值评估唯一性。所有下列的用于XA事务的XA语句必须使用与XA START语句中给定的相同的xid值进行指定。如果您使用这些语句,但是指定的xid值与部分原有的XA事务不对应的话,会发生错误。

一项或多项XA事务可以是同一个全局事务的一部分。在一个给定的全局事务中的所有XA事务必须在xid值中使用同样的gtrid值。出于这个原因,gtrid值必须为全局唯一的,这样,有关一个给定的XA事务是哪个全局事务的一部分的问题就不会含糊不清。对于一个全局事务中的每个XA事务,xid值中的bqual部分必须不一样。(bqual值应不一样,这个要求是当前执行MySQL XA的一个限制条件。这不是XA规约的一部分。)

对于在MySQL服务器上的处于PREPARED状态的XA事务,XA RECOVER语句会返回信息。(见13.4.7.2节,“XA事务状态”.。)输出包括一个行,该行用于服务器上的每个这类XA事务,不论是哪个客户端启动了它。

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部分的串联