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