Criando um Gerenciador de Transações Superior
No KTM, um gerenciador de transações superior é um gerenciador de recursos que cria alistamentos superiores para as transações das quais participa. Um alistamento superior é um alistamento que concede ao gerenciador de recursos a capacidade de coordenar a operação de confirmação para a transação do alistamento. Em outras palavras, um cliente transacional ou o gerenciador de transações superior podem iniciar a sequência de pré-preparação/preparação/confirmação para a transação.
Depois que um gerenciador de recursos tiver criado uma inscrição superior para uma transação, a KTM rejeitará todas as chamadas para ZwCommitTransaction para a transação. Portanto, os clientes transacionais não podem confirmar essa transação. Em vez disso, o gerenciador de recursos que criou o alistamento superior deve chamar ZwPrepareEnlistment, ZwPrepareEnlistment e ZwCommitEnlistment.
Quando criar um Gerenciador de Transações Superior
Suponha que você queira integrar um componente do TPS (sistema de processamento de transações) ao KTM, mas o componente contém seus próprios recursos de gerenciamento de transações não KTM que os clientes podem chamar. Nessa situação, talvez seja necessário criar um gerenciador de transações superior.
Por exemplo, suponha que seu componente forneça suas próprias interfaces que os clientes usam para criar e confirmar transações. Como os clientes do componente não chamam KTM para criar ou confirmar transações, seu componente deve se tornar um gerenciador de transações superior ao integrá-lo a um TPS baseado em KTM.
Como criar um Gerenciador de Transações Superior
Se você quiser que seu componente seja um gerenciador de transações superior, ele deverá fazer o seguinte:
Chame ZwCreateResourceManager para se registrar como um gerenciador de recursos.
Chame ZwCreateTransaction sempre que um cliente do componente criar uma transação usando a interface do cliente do componente.
Chame ZwCreateEnlistment, definindo o sinalizador ENLISTMENT_SUPERIOR e especificando os sinalizadores de acesso ENLISTMENT_SUPERIOR_RIGHTS e ENLISTMENT_SUBORDINATE_RIGHTS.
Chame ZwPrepareEnlistment, ZwPrepareEnlistment e ZwCommitEnlistment quando o cliente do componente chama a interface do cliente do componente para confirmar a transação.
A KTM permite apenas uma inscrição superior por transação. Outros gerenciadores de recursos podem criar alistamentos adicionais. Esses alistamentos são chamados de alistamentos subordinados porque não podem iniciar a operação de confirmação.
Para reverter uma inscrição superior, seu gerenciador de transações superior chama ZwRollbackEnlistment.
Para recuperar um alistamento superior, seu gerenciador de transações superior chama ZwRecoverEnlistment.
Quando um gerenciador de transações superior confirma, reverte ou recupera uma transação, o KTM envia notificações de transação para todos os alistamentos subordinados para que eles possam participar.
Um TPS que inclui um gerenciador de transações superior não pode usar operações de confirmação de fase única.
Durante uma operação de recuperação, se a KTM não puder determinar o resultado de uma transação, ela enviará uma notificação de TRANSACTION_NOTIFY_RECOVER_QUERY ao gerenciador de transações superior. Em resposta, o gerenciador de transações superior deve chamar ZwCommitEnlistment se a transação puder ser confirmada ou ZwRollbackEnlistment se a transação deve ser revertida. Se o gerenciador de transações superior não puder determinar o resultado de uma transação, ele não deverá responder à notificação de TRANSACTION_NOTIFY_RECOVER_QUERY até que possa determinar um resultado.