Spec-Zone.ru › MySQL 8.4

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

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

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

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

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

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

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

  4. Для транзакции XA PREPARED вы можете выполнить команду 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 (), поскольку запрашиваемый 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-8.4-en/xa-states.html

Spec-Zone.ru

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