若要在 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
值由用戶端提供,或由 MySQL 伺服器產生。 xid
值有一到三個部分
xid: gtrid [, bqual [, formatID ]]
gtrid
是一個全域交易識別碼,bqual
是一個分支限定符,而 formatID
是一個數字,用於識別 gtrid
和 bqual
值所使用的格式。如語法所示,bqual
和 formatID
是可選的。如果未給定,則預設的 bqual
值為 ''
。如果未給定,則預設的 formatID
值為 1。
gtrid
和 bqual
必須是字串文字,每個長度最多 64 位元組(非字元)。gtrid
和 bqual
可以透過幾種方式指定。您可以使用帶引號的字串('ab'
)、十六進位字串(X'6162'
、0x6162
)或位元值(b'
)。nnnn
'
formatID
是一個無號整數。
MySQL 伺服器的底層 XA 支援常式會以位元組方式解讀 gtrid
和 bqual
值。然而,在剖析包含 XA 陳述式的 SQL 陳述式時,伺服器會使用某些特定的字元集。為了安全起見,請將 gtrid
和 bqual
寫成十六進位字串。
xid
值通常由交易管理器產生。由一個 TM 產生的值必須與其他 TM 產生的值不同。給定的 TM 必須能夠在 XA RECOVER
陳述式傳回的值清單中識別出自己的 xid
值。
XA START
使用給定的 xid
xid
值啟動 XA 交易。每個 XA 交易都必須具有唯一的 xid
值,因此該值目前不能被另一個 XA 交易使用。唯一性是使用 gtrid
和 bqual
值來評估的。XA 交易的所有後續 XA 陳述式都必須使用與 XA START
陳述式中給定的相同 xid
值來指定。如果您使用任何這些陳述式,但指定的 xid
值不對應於任何現有的 XA 交易,則會發生錯誤。
當伺服器使用 --replicate-do-db
或 --replicate-ignore-db
執行時,XA START
、XA BEGIN
、XA END
、XA COMMIT
和 XA ROLLBACK
陳述式不會被預設資料庫篩選。
一個或多個 XA 交易可以是同一個全域交易的一部分。給定全域交易中的所有 XA 交易都必須在 xid
值中使用相同的 gtrid
值。因此,gtrid
值必須是全域唯一的,這樣就不會對給定 XA 交易是哪個全域交易的一部分產生歧義。xid
值的 bqual
部分對於全域交易中的每個 XA 交易都必須不同。(bqual
值必須不同的要求是目前 MySQL XA 實作的限制。它不是 XA 規格的一部分。)
XA RECOVER
陳述式會傳回 MySQL 伺服器上處於 PREPARED
狀態的那些 XA 交易的資訊。(請參閱第 15.3.8.2 節,「XA 交易狀態」。)輸出包含伺服器上每個此類 XA 交易的列,無論哪個用戶端啟動了它。
XA RECOVER
需要 XA_RECOVER_ADMIN
權限。此權限要求可防止使用者發現其他使用者未完成的預備 XA 交易的 XID 值。它不會影響 XA 交易的正常提交或回滾,因為啟動它的使用者知道其 XID。
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
部分的串聯
XID 值可能包含不可列印的字元。XA RECOVER
允許使用選用的 CONVERT XID
子句,以便用戶端可以請求以十六進位表示的 XID 值。