XA 交易會經歷下列狀態
使用
XA START來啟動 XA 交易並將其置於ACTIVE狀態。對於
ACTIVEXA 交易,發出組成交易的 SQL 陳述式,然後發出XA END陳述式。XA END會將交易置於IDLE狀態。對於
IDLEXA 交易,您可以發出XA PREPARE陳述式或XA COMMIT ... ONE PHASE陳述式XA PREPARE會將交易置於PREPARED狀態。此時的XA RECOVER陳述式會在輸出中包含交易的xid值,因為XA RECOVER會列出處於PREPARED狀態的所有 XA 交易。XA COMMIT ... ONE PHASE會準備並提交交易。xid值不會被XA RECOVER列出,因為交易已終止。
對於
PREPARED的 XA 交易,您可以發出XA COMMIT語句來提交並終止交易,或發出XA ROLLBACK來回滾並終止交易。
以下是一個簡單的 XA 交易,它將一行插入表中,作為全域交易的一部分
mysql> XA START 'xatest';
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO mytable (i) VALUES(10);
Query OK, 1 row affected (0.04 sec)
mysql> XA END 'xatest';
Query OK, 0 rows affected (0.00 sec)
mysql> XA PREPARE 'xatest';
Query OK, 0 rows affected (0.00 sec)
mysql> XA COMMIT 'xatest';
Query OK, 0 rows affected (0.00 sec)MySQL 8.4 支援分離的 XA 交易,由 xa_detach_on_prepare 系統變數啟用(預設為 ON)。分離的交易在執行 XA PREPARE 後會與目前的工作階段斷開連接(並且可以由另一個連線提交或回滾)。這表示目前的工作階段可以自由開始新的本地交易或 XA 交易,而無需等待準備好的 XA 交易被提交或回滾。
當 XA 交易被分離時,連線不會特別知道它已準備的任何 XA 交易。如果目前的工作階段嘗試提交或回滾給定的 XA 交易(即使是它準備的),而在另一個連線已經這樣做之後,該嘗試將會被拒絕,並出現無效的 XID 錯誤 (ER_XAER_NOTA),因為請求的 xid 已不存在。
分離的 XA 交易不能使用暫存表格。
當分離的 XA 交易被停用(xa_detach_on_prepare 設定為 OFF)時,XA 交易會保持連線,直到它被原始連線提交或回滾。對於在群組複寫中使用的 MySQL 伺服器執行個體,不建議停用分離的 XA 交易;請參閱 伺服器執行個體設定,以取得更多資訊。
如果 XA 交易處於 ACTIVE 狀態,您不能發出任何會導致隱含提交的語句。這將違反 XA 合約,因為您將無法回滾 XA 交易。嘗試執行此類語句會引發以下錯誤
ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed
when global transaction is in the ACTIVE state適用於上述說明的語句列在 第 15.3.3 節,「導致隱含提交的語句」。