15.3.8.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)
MySQL 9.2 поддерживает откреплённые XA-транзакции, включённые переменной сервера xa_detach_on_prepare (по умолчанию ON). Откреплённые транзакции отсоединяются от текущего сеанса после выполнения команды XA
PREPARE (и могут быть подтверждены или отменены другим подключением). Это означает, что текущий сеанс свободен для запуска новой локальной транзакции или XA-транзакции без ожидания подтверждения или отката подготовленной XA-транзакции.
Когда XA-транзакции откреплены, подключение не имеет специальной информации о любой XA-транзакции, которую оно подготовило. Если текущий сеанс пытается подтвердить или отменить заданную XA-транзакцию (даже ту, которую он подготовил) после того, как другое подключение уже сделало это, попытка отклоняется с ошибкой недействительного XID (), так как запрашиваемый xid больше не существует.
Откреплённые XA-транзакции не могут использовать временные таблицы.
Когда откреплённые XA-транзакции отключены (xa_detach_on_prepare установлено в OFF), XA-транзакция остаётся подключённой до тех пор, пока она не будет подтверждена или отменена исходным подключением. Отключение откреплённых XA-транзакций не рекомендуется для экземпляра сервера MySQL, используемого в групповой репликации; см. Настройка экземпляра сервера для получения дополнительной информации.
Если 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 «Команды, вызывающие неявное подтверждение».
© 2025 Oracle
Licensed under the GPLv2 License.