Поделиться через


Обработка операций отката

Диспетчер ресурсов, клиент транзакций или KTM может откатить транзакцию, если она определяет, что транзакция не должна быть зафиксирована (обычно из-за обнаружения ошибки).

Чтобы откатить транзакцию, диспетчер ресурсов может вызвать ZwRollbackEnlistment. После вызова ZwCreateEnlistment диспетчер ресурсов может выполнить откат транзакции в любое время перед вызовом ZwPrepareComplete.

Клиенты транзакций могут откатить свои транзакции, вызвав ZwRollbackTransaction. После вызова ZwCreateTransaction клиент транзакций может откатить транзакцию в любое время, прежде чем вызывать ZwCommitTransaction.

Кроме того, транзакционный клиент может задать значение времени ожидания для транзакции, вызвав ZwSetInformationTransaction. KTM откатывает транзакцию, если она не была зафиксирована в течение указанного времени.

При вызове ZwRollbackEnlistment или ZwRollbackTransaction или превышении времени ожидания KTM отправляет уведомление TRANSACTION_NOTIFY_ROLLBACK всем диспетчерам ресурсов.

Когда каждый диспетчер ресурсов получает уведомление TRANSACTION_NOTIFY_ROLLBACK, он должен сделать следующее:

  1. Восстановите данные транзакции в том состоянии, в котором они находились до того, как диспетчер ресурсов начал участвовать в транзакции.

    Как правило, диспетчер ресурсов восстанавливает данные транзакции путем копирования сохраненных исходных данных транзакции из потока журналов в общедоступное, постоянное хранилище базы данных. Дополнительные сведения об использовании потоков журналов см. в разделе "Использование потоков журналов" с KTM.

  2. Вызовите ZwRollbackComplete.

После вызова ZwRollbackComplete диспетчер ресурсов должен вызвать ZwClose, чтобы закрыть дескриптор участия.

Если диспетчер ресурсов инициировал операцию отката, он должен использовать свой клиентский интерфейс, чтобы сообщить клиенту, что транзакция не удалась.