13.3.7.2 XA 트랜잭션의 상태
XA 트랜잭션은 다음 각 상태를 통해 처리됩니다.
XA START를 사용하여 XA 트랜잭션을 시작하고 그것을ACTIVE상태로합니다.ACTIVEXA 트랜잭션에 대한 트랜잭션을 구성하는 SQL 문을 발행 한 후XA END문을 발행합니다.XA END는 트랜잭션을IDLE상태로합니다.IDLEXA 트랜잭션에 대해서는XA PREPARE문 또는XA COMMIT ... ONE PHASE문 중 하나를 실행할 수 있습니다.XA PREPARE트랜잭션을PREPARED상태로합니다. 이 시점에서XA RECOVER문은XA RECOVER가PREPARED상태에있는 모든 XA 트랜잭션을 나열하며 출력 트랜잭션의xid값이 포함됩니다.XA COMMIT ... ONE PHASE트랜잭션의 준비와 노력을합니다. 트랜잭션이 끝나기 때문에xid값은XA RECOVER에 의해 나열되지 않습니다.
PREPAREDXA 트랜잭션에 대해서는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)
특정 클라이언트 연결의 컨텍스트 내에서 XA 트랜잭션과 로컬 (비 XA) 트랜잭션은 상호 배타적입니다. 예를 들어, XA 트랜잭션을 시작하기 위해 XA START 가 발행 된 경우에는 그 XA 트랜잭션이 커밋 또는 롤백 될 때까지 로컬 트랜잭션을 시작할 수 없습니다. 반대로, START TRANSACTION 을 사용하여 로컬 트랜잭션이 시작되면 그 트랜잭션이 커밋 또는 롤백 될 때까지 XA 문을 사용할 수 없습니다.
XA 트랜잭션이 ACTIVE 상태에있는 경우에는 암시 적 커밋을 발생시키는 모든 문이 발행 할 수 없습니다. 그 XA 트랜잭션을 롤백 할 수 없기 때문에 그것을 할 수는 XA 약관에 위배됩니다. 이 같은 문을 실행하려고하면 다음 오류가 표시됩니다.
ERROR 1399 (XAE07) : XAER_RMFAIL : The command can not be executed when global transaction is in the ACTIVE state
전주의 사항이 적용되는 문은 섹션 13.3.3 "암시 적 커밋을 발생시키는 문" 에 나와 있습니다.