Использование потоков журналов с KTM

Системы обработки транзакций на основе KTM (TPS) должны регистрировать действия транзакций с помощью общей файловой системы журналов (CLFS). KTM создает поток журнала для каждого объекта диспетчера транзакций. Каждый диспетчер ресурсов должен создавать собственный поток журналов.

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

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

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

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

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

Создание потоков журналов для диспетчеров ресурсов

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

KTM и все диспетчеры ресурсов TPS могут использовать один файл журнала, но каждый компонент TPS должен использовать отдельный поток в файле журнала. Сведения о том, как указать отдельные потоки в файле журнала, см. в разделе ClfsCreateLogFile.

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

Дополнительные сведения о перезапуске областей в потоках журналов CLFS см. в разделе Чтение записей перезапуска из потока CLFS. См. также процедуры ClfsWriteRestartArea, ClfsReadRestartArea и ClfsReadPreviousRestartArea .

Использование потоков журналов для восстановления

После того как диспетчер ресурсов вызывает ZwCreateTransactionManager, он должен вызвать ZwRecoverTransactionManager. Подпрограмма ZwRecoverTransactionManager считывает поток журнала объекта диспетчера транзакций, чтобы восстановить состояние TPS до известной хорошей точки. Если компьютер завершил работу должным образом (или не завершил работу) после последней загрузки диспетчера ресурсов, поток журнала содержит минимальные сведения. Если произошел сбой системы, поток журнала содержит достаточно сведений о восстановлении для восстановления всех транзакций в известном состоянии.

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

Хранение данных транзакций

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

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

  2. Выполните операцию с копией данных, не изменяя постоянное хранилище базы данных.

  3. Скопируйте новые данные в область маршалинга.

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

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