Создание превосходного менеджера транзакций
В KTM превосходный диспетчер транзакций — это диспетчер ресурсов , который создает превосходные перечисления для транзакций, в которые он участвует. Превосходное участие — это участие, которое предоставляет диспетчеру ресурсов возможность координировать операцию фиксации для транзакции участия. Другими словами, клиент транзакций или вышестоящий менеджер транзакций может запустить последовательность пред-подготовки, подготовки и фиксации для транзакции.
После того как диспетчер ресурсов создал высшую регистрацию для транзакции, KTM отклоняет все вызовы ZwCommitTransaction по этой транзакции. Таким образом, клиенты транзакций не могут зафиксировать такую транзакцию. Вместо этого диспетчер ресурсов, создавший приоритетную регистрацию, должен вызывать функции ZwPrePrepareEnlistment, ZwPrepareEnlistment и ZwCommitEnlistment.
Когда создавать более совершенного диспетчера транзакций
Предположим, что вы хотите интегрировать компонент системы обработки транзакций (TPS) с KTM, но этот компонент имеет собственные возможности управления транзакциями, не связанные с KTM, которые могут вызывать клиенты. В такой ситуации может потребоваться создать превосходный диспетчер транзакций.
Например, предположим, что компонент предоставляет собственные интерфейсы, используемые клиентами для создания и фиксации транзакций. Так как клиенты компонента не вызывают KTM для создания или фиксации транзакций, компонент должен стать превосходным диспетчером транзакций при его интеграции в TPS на основе KTM.
Как создать превосходного диспетчера транзакций
Если вы хотите, чтобы компонент был превосходным диспетчером транзакций, он должен сделать следующее:
Вызовите 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 до тех пор, пока он не сможет определить результат.