Создание диспетчера транзакций superior
В KTM вышестоящий диспетчер транзакций — это диспетчер ресурсов, который создает расширенные зачисления для транзакций, в которые он участвует. Лучшее зачисление — это зачисление, которое предоставляет диспетчеру ресурсов возможность координировать операцию фиксации для транзакции зачисления. Иными словами, транзакционный клиент или вышестоящий диспетчер транзакций может запустить последовательность предварительной подготовки, подготовки и фиксации для транзакции.
После создания диспетчером ресурсов высшего зачисления для транзакции KTM отклоняет все вызовы ZwCommitTransaction для транзакции. Таким образом, транзакционные клиенты не могут зафиксировать такую транзакцию. Вместо этого диспетчер ресурсов, создавший высшее зачисление, должен вызывать ZwPrePrepareEnlistment, ZwPrepareEnlistment и ZwCommitEnlistment.
Когда следует создавать диспетчер транзакций superior
Предположим, что вы хотите интегрировать компонент системы обработки транзакций (TPS) с KTM, но компонент содержит собственные возможности управления транзакциями, не относящиеся к KTM, которые могут вызывать клиенты. В такой ситуации может потребоваться создать диспетчер транзакций высшего типа.
Например, предположим, что компонент предоставляет собственные интерфейсы, которые клиенты используют для создания и фиксации транзакций. Так как клиенты компонента не вызывают KTM для создания или фиксации транзакций, компонент должен стать превосходным диспетчером транзакций при его интеграции в TPS на основе KTM.
Создание диспетчера транзакций superior
Если вы хотите, чтобы компонент был превосходным диспетчером транзакций, он должен выполнять следующие действия.
Вызовите ZwCreateResourceManager , чтобы зарегистрироваться в качестве диспетчера ресурсов.
Вызывайте ZwCreateTransaction каждый раз, когда клиент компонента создает транзакцию с помощью клиентского интерфейса компонента.
Вызовите ZwCreateEnlistment, задав флаг ENLISTMENT_SUPERIOR и указав флаги доступа ENLISTMENT_SUPERIOR_RIGHTS и ENLISTMENT_SUBORDINATE_RIGHTS.
Вызовите ZwPrePrepareEnlistment, ZwPrepareEnlistment и ZwCommitEnlistment , когда клиент компонента вызывает клиентский интерфейс компонента для фиксации транзакции.
KTM разрешает только одно высшее зачисление на транзакцию. Другие диспетчеры ресурсов могут создавать дополнительные зачисления. Эти зачисления называются подчиненными, так как они не могут инициировать операцию фиксации.
Для отката лучшего зачисления ваш диспетчер транзакций вызывает ZwRollbackEnlistment.
Чтобы восстановить высшее зачисление, диспетчер транзакций высшего звена вызывает ZwRecoverEnlistment.
Когда вышестоящий диспетчер транзакций фиксирует, откатывает или восстанавливает транзакцию, KTM отправляет уведомления о транзакциях всем подчиненным зачислениям, чтобы они могли участвовать.
TPS, включающая диспетчер транзакций высшего уровня, не может использовать однофазные операции фиксации.
Если во время операции восстановления KTM не может определить результат транзакции, он отправляет TRANSACTION_NOTIFY_RECOVER_QUERY уведомление вышестоящему диспетчеру транзакций. В ответ на это вышестоящий диспетчер транзакций должен вызвать ZwCommitEnlistment , если транзакция может быть зафиксирована, или ZwRollbackEnlistment , если транзакция должна быть откатена. Если вышестоящий диспетчер транзакций не может определить результат транзакции, он не должен отвечать на уведомление TRANSACTION_NOTIFY_RECOVER_QUERY, пока не сможет определить результат.