Обработка операций восстановления

В операции восстановления система обработки транзакций (TPS) пытается восстановить свое состояние из сведений, которые содержатся в потоках журналов. После завершения операции восстановления все транзакции должны находиться в состоянии фиксации или отката, а все данные ресурсов должны находиться в известном работоспособном состоянии.

Иногда TPS останавливается до завершения всех своих транзакций. Например, может произойть сбой операционной системы. Поэтому диспетчеры ресурсов должны инициировать операции восстановления при каждом запуске. Операция восстановления пытается определить, являются ли какие-либо транзакции неполными. Если в журнале обнаружены неполные транзакции, операция восстановления пытается зафиксировать или откатить эти транзакции.

Для TPS на основе KTM каждая операция восстановления состоит из двух этапов. Первый шаг включает в себя восстановление сведений из потока журнала объекта диспетчера транзакций. Второй шаг включает восстановление сведений из потока журнала диспетчера ресурсов.

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

Восстановление данных из потока журнала объекта диспетчера транзакций

Сразу после того, как диспетчер ресурсов вызывает ZwCreateTransactionManager или ZwOpenTransactionManager, он должен вызвать ZwRecoverTransactionManager. Подпрограмма ZwRecoverTransactionManager считывает поток журнала, принадлежащий объекту диспетчера транзакций. Эта подпрограмма восстанавливает состояние объекта диспетчера транзакций (включая все транзакции, зачисления и диспетчеры ресурсов) из сведений о восстановлении, которые содержатся в потоке журнала, начиная с последней области перезапуска , созданной KTM, и заканчивая в конце потока.

Чтобы восстановить область последнего перезапуска до указанного значения виртуальных часов, диспетчер ресурсов может вызвать ZwRollforwardTransactionManager вместо ZwRecoverTransactionManager.

Восстановление данных из потока журнала Resource Manager

Сразу после вызова ZwCreateResourceManager или ZwOpenResourceManager диспетчер ресурсов должен вызвать ZwRecoverResourceManager. Подпрограмма ZwRecoverResourceManager пытается восстановить транзакции, связанные с каждым из прикреплений диспетчера ресурсов.

Когда диспетчер ресурсов вызывает ZwRecoverResourceManager, KTM отправляет TRANSACTION_NOTIFY_RECOVER уведомления для каждого из зачислений диспетчера ресурсов. Диспетчер ресурсов должен вызывать ZwRecoverEnlistment каждый раз, когда получает одно из уведомлений TRANSACTION_NOTIFY_RECOVER.

Когда диспетчер ресурсов вызывает ZwRecoverEnlistment, KTM отправляет одно из следующих уведомлений:

  • TRANSACTION_NOTIFY_COMMIT

    Диспетчер ресурсов должен использовать сведения в своем потоке журнала для фиксации транзакции, а затем должен вызвать ZwCommitComplete.

  • TRANSACTION_NOTIFY_ROLLBACK

    Диспетчер ресурсов должен использовать сведения в своем потоке журнала для отката транзакции, а затем вызвать ZwRollbackComplete.

  • TRANSACTION_NOTIFY_INDOUBT

    KTM не определил состояние транзакции и отправит уведомление о фиксации или откате позже.

Как правило, KTM отправляет уведомление TRANSACTION_NOTIFY_COMMIT, если определяет, что все диспетчеры ресурсов с именем ZwPrepareComplete до остановки и перезапуска TPS. KTM отправляет TRANSACTION_NOTIFY_ROLLBACK уведомление, если определяет, что один или несколько диспетчеров ресурсов не вызвали ZwPrepareComplete.

После отправки TRANSACTION_NOTIFY_RECOVER уведомления о каждом зачислении KTM отправляет TRANSACTION_NOTIFY_LAST_RECOVER уведомление.

Если диспетчер ресурсов называется ZwRollforwardTransactionManager вместо ZwRecoverTransactionManager, он должен восстановить только до значения виртуальных часов, указанного в ZwRollforwardTransactionManager.

Диспетчеры ресурсов могут вызывать ZwSetInformationEnlistment , чтобы задать настраиваемые сведения о восстановлении. KTM сохраняет эти сведения и записывает их в поток журнала, но KTM не пытается интерпретировать эти сведения. Диспетчер ресурсов может получить сведения о восстановлении в любое время, вызвав ZwQueryInformationEnlistment.

Диспетчеры транзакций высшего звена иногда получают уведомления TRANSACTION_NOTIFY_RECOVER_QUERY во время операции восстановления.