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


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

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

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

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

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

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

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

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

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

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

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

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