XA 交易會依序經過下列狀態
使用
XA START來啟動 XA 交易,並將其設為ACTIVE狀態。對於
ACTIVE的 XA 交易,請發出構成交易的 SQL 陳述式,然後發出XA END陳述式。XA END會將交易設為IDLE狀態。對於
IDLE的 XA 交易,您可以發出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 9.0 支援分離的 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 節, 「導致隱含提交的陳述式」。