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


Использование значений виртуальных часов

KTM предоставляет виртуальные часы для каждого объекта диспетчера транзакций. Когда диспетчер ресурсов вызывает ZwCreateTransactionManager, KTM устанавливает для виртуальных часов объекта значение 1. KTM увеличивает значение виртуальных часов при каждом запуске операции фиксации. Всякий раз, когда KTM выполняет запись в свой поток журнала, он включает текущее значение виртуальных часов в запись журнала.

Когда диспетчер ресурсов вызывает ZwRecoverTransactionManager, KTM считывает записи потока журналов вплоть до конца потока и устанавливает значение виртуальных часов объекта диспетчера транзакций в последнее значение, найденное в потоке журнала объекта.

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

KTM позволяет диспетчерам ресурсов и вышестоящим диспетчерам транзакций изменять значение виртуальных часов объекта диспетчера транзакций, но обычно изменять значение часов не требуется.

Когда следует изменять значения виртуальных часов

Как правило, системе обработки транзакций (TPS) не нужно изменять значения виртуальных часов, если компоненты в TPS не пытаются синхронизировать несколько потоков журналов.

Например, предположим, что ваш TPS содержит несколько диспетчеров ресурсов, которые взаимодействуют друг с другом во время последовательностей предварительной подготовки, подготовки и фиксации. Также предположим, что каждый диспетчер ресурсов создает объект диспетчера транзакций с уникальным потоком журналов. Чтобы убедиться, что KTM восстанавливает состояние всех диспетчеров ресурсов до одной и той же точки во времени во время операции восстановления, эти диспетчеры ресурсов могут выполнить следующие действия:

  • Когда один диспетчер ресурсов взаимодействует с другим, он передает последнее значение виртуальных часов, полученное от KTM или еще одного диспетчера ресурсов.

  • Всякий раз, когда диспетчер ресурсов вызывает подпрограмму KTM, которая принимает значение виртуальных часов (см. следующий раздел этой статьи), он передает наибольшее значение часов, полученное от KTM или другого диспетчера ресурсов.

  • Каждый диспетчер ресурсов записывает значения виртуальных часов в свой поток журнала и использует эти значения при выполнении операций отката или восстановления.

Эти шаги приводят к тому, что значения виртуальных часов, которые KTM хранит для каждого объекта диспетчера транзакций, почти или точно совпадают. Таким образом, если операция восстановления приводит к тому, что KTM считывает свои потоки журналов или когда операция отката заставляет диспетчеров ресурсов считывать потоки журналов, восстановление или откат выполняется на основе синхронизированных потоков журналов.

Изменение значений виртуальных часов

Диспетчеры ресурсов могут изменять значение виртуальных часов, передав новое значение в ZwPrepareComplete, ZwPrepareComplete, ZwCommitComplete, ZwRollbackComplete, ZwReadOnlyEnlistment или ZwSinglePhaseReject.

Улучшенные диспетчеры транзакций могут изменять значение виртуальных часов, передав новое значение в ZwPrePrepareEnlistment, ZwPrepareEnlistment, ZwCommitEnlistment или ZwReadOnlyEnlistment.

Кроме того, диспетчер ресурсов или вышестоящий диспетчер транзакций, использующий подпрограмму обратного вызова ResourceManagerNotification , может изменять значение виртуальных часов, которое получает эта процедура обратного вызова. Затем KTM сохраняет обновленное значение.

Если диспетчер ресурсов или вышестоящий диспетчер транзакций передает новое значение часов в KTM, KTM сохраняет новое значение, только если оно больше текущего значения часов. В противном случае KTM сохраняет текущее значение часов.

Диспетчеры ресурсов и вышестоящие диспетчеры транзакций могут получить значение виртуальных часов объекта диспетчера транзакций, вызвав подпрограмму ZwQueryInformationTransactionManager .