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