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в этот момент включает в свой вывод значениеxid, потому чтоXA RECOVERперечисляет все XA-транзакции, находящиеся в состоянииPREPARED.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
START была выполнена для начала XA-транзакции, локальную транзакцию нельзя начать, пока XA-транзакция не будет завершена или отменена. Аналогично, если локальная транзакция была начата с помощью START
TRANSACTION, никакие XA-команды нельзя использовать, пока транзакция не будет завершена или отменена.
Если XA-транзакция находится в состоянии ACTIVE, нельзя выполнять команды, вызывающие неявное подтверждение. Это нарушило бы контракт XA, так как невозможно было бы отменить XA-транзакцию. Если вы попытаетесь выполнить такую команду, будет выведено следующее сообщение об ошибке:
ERROR 1399 (XAE07): XAER_RMFAIL: The command cannot be executed
when global transaction is in the ACTIVE state
Команды, на которые распространяется предыдущее замечание, перечислены в разделе 13.3.3, «Команды, вызывающие неявное подтверждение».
© 2025 Oracle
Licensed under the GPLv2 License.