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