Spec-Zone.ru › MySQL 9.2

15.3.8.2 Состояния транзакций XA

Транзакция XA проходит через следующие состояния:

  1. Используйте XA START, чтобы начать транзакцию XA и перевести её в состояние ACTIVE.

  2. Для ACTIVE XA-транзакции, выполните SQL-команды, составляющие транзакцию, а затем выполните команду XA END. Команда XA END помещает транзакцию в состояние IDLE.

  3. Для IDLE XA-транзакции, вы можете выполнить либо команду XA PREPARE, либо команду XA COMMIT ... ONE PHASE:

    • XA PREPARE помещает транзакцию в состояние PREPARED. Команда XA RECOVER в этот момент включает значение xid в свой вывод, поскольку XA RECOVER перечисляет все XA-транзакции, находящиеся в состоянии PREPARED.

    • XA COMMIT ... ONE PHASE подготавливает и подтверждает транзакцию. Значение xid не отображается командой XA RECOVER, так как транзакция завершается.

  4. Для 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.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.
https://docs.oracle.com/cd/E17952_01/mysql-9.2-en/xa-states.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API