Примечание
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
KTM предоставляет виртуальные часы для каждого объекта диспетчера транзакций. Когда диспетчер ресурсов вызывает ZwCreateTransactionManager, KTM задает значение виртуальных часов объекта равным 1. KTM увеличивает значение виртуальных часов при каждом запуске операции фиксации. Каждый раз, когда KTM записывает в поток журналов, он включает текущее значение виртуальных часов в записи журнала.
Когда диспетчер ресурсов вызывает ZwRecoverTransactionManager, KTM считывает записи потока журналов до конца этого потока и устанавливает значение виртуальных часов объекта диспетчера транзакций на последнее значение, которое он находит в потоке журнала объекта.
Когда менеджер ресурсов вызывает ZwRollforwardTransactionManager, KTM считывает записи потока журналов до указанного значения времени, а значение виртуальных часов диспетчера транзакций устанавливает на указанное значение времени.
KTM позволяет диспетчерам ресурсов и старшим диспетчерам транзакций изменять значение виртуальных часов объекта диспетчера транзакций, но, как правило, они не должны изменять значение часов.
Изменение значений виртуальных часов
Как правило, системе обработки транзакций (TPS) не нужно изменять значения виртуальных часов, если только компоненты в TPS не пытаются синхронизировать несколько потоков журналов.
Например, предположим, что ваша TPS содержит несколько диспетчеров ресурсов, которые взаимодействуют друг с другом в процессе предварительной подготовки, подготовки и фиксации. Кроме того, предположим, что каждый диспетчер ресурсов создает объект диспетчера транзакций, имеющий уникальный поток журнала. Чтобы убедиться, что KTM восстанавливает состояние всех диспетчеров ресурсов на один и тот же момент времени во время операции восстановления, эти диспетчеры ресурсов могут использовать следующие действия:
Когда один диспетчер ресурсов взаимодействует с другим, он передает последнее значение виртуальных часов, полученное от KTM или еще одного диспетчера ресурсов.
Когда диспетчер ресурсов вызывает подпрограмму KTM, которая принимает значение виртуальных часов (см. следующий раздел в этом разделе), оно передает наибольшее значение часов, полученное из KTM или другого диспетчера ресурсов.
Каждый диспетчер ресурсов записывает значения виртуальных часов в поток журналов и использует эти значения при выполнении операций отката или восстановления.
Эти действия приводят к тому, что значения виртуальных часов, которые KTM хранит для каждого объекта диспетчера транзакций, почти или точно совпадают. Таким образом, если операция восстановления приводит к тому, что KTM считывает потоки журналов или когда операция отката приводит к тому, что диспетчеры ресурсов считывают потоки журналов, восстановление или откат основан на синхронизированных потоках журналов.
Изменение значений виртуальных часов
Диспетчеры ресурсов могут изменять значение виртуальных часов, передавая новое значение в ZwPrePrepareComplete, ZwPrepareComplete, ZwCommitComplete, ZwRollbackComplete, ZwReadOnlyEnlistment или ZwSinglePhaseReject.
Лучшие диспетчеры транзакций могут изменить значение виртуальных часов, передав новое значение ZwPrepareEnlistment, ZwPrepareEnlistment, ZwCommitEnlistment или ZwReadOnlyEnlistment.
Кроме того, диспетчер ресурсов или более высокий диспетчер транзакций, использующий подпрограмму обратного вызова ResourceManagerNotification , может изменить значение виртуальных часов, которое получает подпрограмма обратного вызова. Затем KTM сохраняет обновленное значение.
Если диспетчер ресурсов или более высокий диспетчер транзакций передает новое значение часов в KTM, KTM сохраняет новое значение только в том случае, если оно больше текущего значения часов. В противном случае KTM сохраняет текущее значение часов.
Диспетчеры ресурсов и лучшие диспетчеры транзакций могут получить значение виртуальных часов объекта диспетчера транзакций, вызвав подпрограмму ZwQueryInformationTransactionManager .