Notificações de transação

O KTM fornece uma fila de notificação para cada gerenciador de recursos. A KTM entrega notificações a um gerenciador de recursos colocando-as na fila do gerenciador de recursos.

Um gerenciador de recursos pode recuperar notificações de sua fila de forma síncrona ou assíncrona.

  • Para recuperar notificações de forma síncrona, o gerenciador de recursos pode chamar repetidamente ZwGetNotificationResourceManager.

  • Para receber notificações de forma assíncrona, o gerenciador de recursos pode chamar TmEnableCallbacks para configurar uma rotina de retorno de chamada. A KTM chama a rotina de retorno de chamada sempre que coloca uma notificação na fila do gerenciador de recursos.

Quando um gerenciador de recursos chama ZwCreateEnlistment para criar uma inscrição para uma transação, o gerenciador de recursos especifica os tipos de notificações que deve receber. Os gerenciadores de recursos recebem apenas notificações que se registram para receber.

As constantes de notificação são definidas em Ktmtypes.h. Os nomes constantes de notificação têm um formato de TRANSACTION_NOTIFY_Xxx.

O restante deste tópico lista todas as constantes de notificação que Ktmtypes.h define e as divide em três grupos:

  • Notificações que os gerenciadores de recursos podem receber

  • Notificações que os gerenciadores de transações superiores podem receber

  • Constantes de notificação definidas, mas atualmente não usadas

Notificações para Resource Managers

Todos os gerenciadores de recursos devem se registrar para receber TRANSACTION_NOTIFY_PREPREPARE, TRANSACTION_NOTIFY_PREPARE e TRANSACTION_NOTIFY_COMMIT notificações, mesmo que, posteriormente, chamem ZwReadOnlyEnlistment para marcar uma inscrição como somente leitura.

Os gerenciadores de recursos podem dar suporte a TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT, mas também devem dar suporte às notificações de pré-preparação, preparação e confirmação de várias fases.

A lista a seguir contém todas as notificações que os gerenciadores de recursos podem receber:

TRANSACTION_NOTIFY_PREPREPARE
Quando enviado: um cliente chama ZwCommitTransaction e nenhum gerenciador de recursos dá suporte à confirmação de fase única ou se um gerenciador de transações superior chama ZwPreprepareEnlistment.

Recebido por: Gerenciadores de recursos.

Ação necessária do destinatário: execute operações de pré-preparação e chame ZwPrePrepareComplete. (Para obter mais informações sobre operações de pré-preparação, consulte Manipulando operações de confirmação.)

Restrições: O gerenciador de recursos também deve dar suporte a TRANSACTION_NOTIFY_PREPARE e TRANSACTION_NOTIFY_COMMIT.

TRANSACTION_NOTIFY_PREPARE
Quando enviado: após TRANSACTION_NOTIFY_PREPREPARE se um cliente chamar ZwCommitTransaction e nenhum gerenciador de recursos der suporte à confirmação de fase única ou se um gerenciador de transações superior chamar ZwPrepareEnlistment.

Recebido por: Gerenciadores de recursos.

Ação necessária do destinatário: Execute operações de preparação e, em seguida, chame ZwPrepareComplete. (Para obter mais informações sobre como preparar operações, consulte Manipulando operações de confirmação.)

Restrições: O gerenciador de recursos também deve dar suporte a TRANSACTION_NOTIFY_PREPREPARE e TRANSACTION_NOTIFY_COMMIT.

TRANSACTION_NOTIFY_COMMIT
Quando enviado: após TRANSACTION_NOTIFY_PREPARE se um cliente chamar ZwCommitTransaction e nenhum gerenciador de recursos der suporte à confirmação de fase única ou se um gerenciador de transações superior chamar ZwCommitEnlistment.

Recebido por: Gerenciadores de recursos.

Ação necessária do destinatário: execute operações de confirmação e, em seguida, chame ZwCommitComplete. (Para obter mais informações sobre operações de confirmação, consulte Manipulando operações de confirmação.)

Restrições: O gerenciador de recursos também deve dar suporte a TRANSACTION_NOTIFY_PREPREPARE e TRANSACTION_NOTIFY_PREPARE.

TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT
Quando enviado: um cliente chama ZwCommitTransaction e um gerenciador de recursos dá suporte a operações de confirmação de fase única.

Recebido por: Gerenciadores de recursos.

Ação necessária do destinatário: confirme a transação ou chame ZwSinglePhaseReject. (Para obter mais informações sobre operações de confirmação de fase única, consulte Manipulando operações de confirmação.)

Restrições: O gerenciador de recursos também deve dar suporte a TRANSACTION_NOTIFY_PREPREPARE, TRANSACTION_NOTIFY_PREPARE e TRANSACTION_NOTIFY_COMMIT.

TRANSACTION_NOTIFY_ROLLBACK
Quando enviado: um cliente chama ZwRollbackTransaction, um gerenciador de transações superior chama ZwRollbackEnlistment ou KTM detecta um erro (como uma gravação com falha no fluxo de log).

Recebido por: gerenciadores de recursos e gerenciadores de transações superiores.

Ação necessária do destinatário: execute todas as operações necessárias para reverter os dados da transação e, em seguida, chame ZwRollbackComplete. (Para obter mais informações sobre operações de reversão, consulte Manipulando operações de reversão.)

Restrições: Todos os gerenciadores de recursos e gerenciadores de transações superiores devem dar suporte a TRANSACTION_NOTIFY_ROLLBACK.

TRANSACTION_NOTIFY_RECOVER
Quando enviado: um gerenciador de recursos chama ZwRecoverResourceManager.

Recebido por: Gerenciadores de recursos.

Ação necessária do destinatário: o gerenciador de recursos deve chamar ZwRecoverEnlistment. (Para obter mais informações sobre operações de recuperação, consulte Manipulando operações de recuperação.)

Restrições: nenhuma.

TRANSACTION_NOTIFY_LAST_RECOVER
Quando enviado: depois que a KTM enviar a última TRANSACTION_NOTIFY_RECOVER para as inscrições de um gerenciador de recursos.

Recebido por: Gerenciadores de recursos.

Ação necessária do destinatário: encerrar a operação de recuperação. (Para obter mais informações sobre operações de recuperação, consulte Manipulando operações de recuperação.)

Restrições: nenhuma.

TRANSACTION_NOTIFY_INDOUBT
Quando enviado: depois que um gerenciador de recursos chama ZwRecoverEnlistment, se o KTM não puder determinar se a transação deve ser confirmada ou revertida (normalmente porque o TPS tem um gerenciador de transações superior indisponível).

Recebido por: Gerenciadores de recursos.

Ação necessária do destinatário: não faça nada até que o KTM envie TRANSACTION_NOTIFY_COMMIT ou TRANSACTION_NOTIFY_ROLLBACK.

Restrições: nenhuma.

TRANSACTION_NOTIFY_RM_DISCONNECTED
Quando enviado: o gerenciador de recursos que está tratando uma operação de confirmação de fase única fecha o identificador de inscrição sem indicar que ele confirmou ou reverteu a transação.

Recebido por: Gerenciadores de recursos e gerenciadores de transações superiores que têm inscrições para a transação.

Ação necessária do destinatário: operações de limpeza específicas da transação. Normalmente, essa notificação é útil para gerenciadores de recursos somente leitura.

Restrições: nenhuma.

Notificações para Gerenciadores de Transações Superiores

Os gerenciadores de transações superiores podem receber as seguintes notificações:

TRANSACTION_NOTIFY_ROLLBACK
Confira a descrição anterior.

TRANSACTION_NOTIFY_RM_DISCONNECTED
Confira a descrição anterior.

TRANSACTION_NOTIFY_PREPREPARE_COMPLETE
Quando enviado: depois que todos os gerenciadores de recursos receberem TRANSACTION_NOTIFY_PREPREPARE e responderem chamando ZwPrePrepareComplete.

Recebido por: gerenciadores de transações superiores.

Ação necessária do destinatário: o gerenciador de transações superior deve chamar ZwPrepareEnlistment.

TRANSACTION_NOTIFY_PREPARE_COMPLETE
Quando enviado: depois que todos os gerenciadores de recursos receberem TRANSACTION_NOTIFY_PREPARE e responderem chamando ZwPrepareComplete.

Recebido por: gerenciadores de transações superiores.

Ação necessária do destinatário: o gerenciador de transações superior deve chamar ZwCommitEnlistment.

TRANSACTION_NOTIFY_COMMIT_COMPLETE
Quando enviado: depois que todos os gerenciadores de recursos receberem TRANSACTION_NOTIFY_COMMIT e responderem chamando ZwCommitComplete.

Recebido por: gerenciadores de transações superiores.

Ação necessária do destinatário: operações de limpeza de transação.

TRANSACTION_NOTIFY_ROLLBACK_COMPLETE
Quando enviado: depois que todos os gerenciadores de recursos receberem TRANSACTION_NOTIFY_ROLLBACK e responderem chamando ZwRollbackComplete.

Recebido por: Gerentes de transações superiores.

Ação necessária do destinatário: operações de limpeza de transações.

TRANSACTION_NOTIFY_RECOVER_QUERY
Quando enviado: um gerenciador de transações superior chama ZwRecoverResourceManager.

Recebido por: Gerentes de transações superiores.

Ação necessária do destinatário: o gerenciador de transações superior deve chamar ZwCommitEnlistment ou ZwRollbackEnlistment para a inscrição.

TRANSACTION_NOTIFY_COMMIT_REQUEST
Quando enviado: um cliente chama ZwCommitTransaction. Se um gerenciador de transações superior tiver se registrado para essa notificação para uma inscrição, a KTM enviará TRANSACTION_NOTIFY_COMMIT_REQUEST para o gerenciador de transações superior em vez de enviar TRANSACTION_NOTIFY_COMMIT para os gerenciadores de recursos.

Recebido por: Gerentes de transações superiores.

Ação necessária do destinatário: o gerenciador de transações superior chama ZwCommitEnlistment.

TRANSACTION_NOTIFY_REQUEST_OUTCOME
Quando enviado: um gerenciador de recursos chama TmRequestOutcomeEnlistment enquanto a transação está em seu estado preparado.

Recebido por: Gerentes de transações superiores.

Ação necessária do destinatário: o gerenciador de transações superior deve chamar ZwCommitEnlistment ou ZwRollbackEnlistment.

Notificações não utilizados

As seguintes notificações são definidas em Ktmtypes.h, mas a KTM atualmente não dá suporte a elas:

TRANSACTION_NOTIFY_DELEGATE_COMMIT

TRANSACTION_NOTIFY_ENLIST_MASK

TRANSACTION_NOTIFY_ENLIST_PREPREPARE

TRANSACTION_NOTIFY_MARSHAL

TRANSACTION_NOTIFY_PROMOTE

TRANSACTION_NOTIFY_PROMOTE_NEW

TRANSACTION_NOTIFY_PROPAGATE_PULL

TRANSACTION_NOTIFY_PROPAGATE_PUSH

TRANSACTION_NOTIFY_TM_ONLINE

TRANSACTION_NOTIFY_COMMIT_FINALIZE