Обработка операций отката
Диспетчер ресурсов, транзакционный клиент или KTM могут откатить транзакцию, если определяет, что транзакция не должна быть зафиксирована (обычно из-за обнаружения ошибки).
Для отката транзакции диспетчер ресурсов может вызвать ZwRollbackEnlistment. После того как диспетчер ресурсов вызовет ZwCreateEnlistment для зачисления в транзакцию, он может в любое время откатить транзакцию, прежде чем вызвать ZwPrepareComplete.
Транзакционные клиенты могут откатывать свои транзакции, вызывая ZwRollbackTransaction. После того как транзакционный клиент вызовет ZwCreateTransaction для создания транзакции, он может в любое время откатить транзакцию, прежде чем вызвать ZwCommitTransaction.
Кроме того, транзакционный клиент может задать значение времени ожидания для транзакции, вызвав ZwSetInformationTransaction. KTM выполняет откат транзакции, если она не была зафиксирована в течение указанного периода времени.
При вызове ZwRollbackEnlistment или ZwRollbackTransaction или превышении времени ожидания KTM отправляет уведомление TRANSACTION_NOTIFY_ROLLBACK всем диспетчерам ресурсов.
Когда каждый диспетчер ресурсов получает уведомление TRANSACTION_NOTIFY_ROLLBACK, он должен сделать следующее:
Восстановите данные транзакции в том состоянии, в которое они находились до того, как диспетчер ресурсов был зачислен в транзакцию.
Как правило, диспетчер ресурсов восстанавливает данные транзакции, копируя сохраненные начальные данные транзакции из потока журнала в общедоступное постоянное хранилище базы данных. Дополнительные сведения об использовании потоков журналов см. в статье Использование потоков журналов с KTM.
Вызовите ZwRollbackComplete.
После вызова ZwRollbackComplete диспетчер ресурсов должен вызвать ZwClose , чтобы закрыть дескриптор зачисления.
Если диспетчер ресурсов инициировал операцию отката, он должен использовать свой клиентский интерфейс, чтобы сообщить клиенту о сбое транзакции.