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 節, 「導致隱含提交的陳述式」。