Manipulando operações de confirmação
Há dois tipos de operações de confirmação: confirmação de fase única e confirmação de várias fases. Uma operação de confirmação de fase única consiste em uma única notificação à qual os gerenciadores de recursos devem responder, enquanto uma operação de confirmação de várias fases inclui notificações adicionais para as etapas de preparação.
Uma operação de confirmação de fase única é mais simples de implementar. É apropriado para TPSs (sistemas de processamento de transações) que têm uma das seguintes características:
Um único gerenciador de recursos.
Vários gerenciadores de recursos, todos menos um deles são somente leitura e não participam da operação de confirmação.
Uma operação de confirmação de várias fases será necessária se vários gerenciadores de recursos participarem da operação de confirmação.
Operações de confirmação do Single-Phase
Se você quiser que o TPS dê suporte a operações de confirmação de fase única, um (e apenas um) gerenciador de recursos deverá se registrar para receber TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT notificações para suas inscrição. Todos os outros gerenciadores de recursos devem ser somente leitura.
Um TPS que inclui um gerenciador de transações superior não pode usar a confirmação de fase única.
Se um gerenciador de recursos tiver se registrado para receber TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT notificações, o KTM enviará esse tipo de notificação quando um cliente transacional chamar ZwCommitTransaction.
Quando o gerenciador de recursos recebe uma notificação de TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT para uma transação, ele pode confirmar a transação ou rejeitar a confirmação de fase única.
Para confirmar a transação, o gerenciador de recursos deve fazer o seguinte:
Libere todos os dados que ele está mantendo em um cache não permanente (armazenamento na memória), como a área de marshaling do CLFS para um fluxo de log CLFS.
O gerenciador de recursos deve mover os dados do cache para um meio de armazenamento durável. Por exemplo, um gerenciador de recursos que está usando CLFS pode chamar ClfsFlushBuffers.
Torne todas as alterações de dados permanentes e públicas (ou seja, visíveis fora do escopo do gerenciador de recursos).
Chame ZwCommitComplete.
Depois de chamar ZwCommitComplete, o gerenciador de recursos deve chamar ZwClose para fechar o identificador de inscrição.
Para rejeitar uma operação de confirmação de fase única para a transação, o gerenciador de recursos pode chamar ZwSinglePhaseReject. Se o gerenciador de recursos chamar ZwSinglePhaseReject, o KTM alterará imediatamente a operação de confirmação de fase única para várias fases.
Se outros gerenciadores de recursos se inscreverem na mesma transação, eles deverão ser somente leitura. No entanto, eles devem se registrar para receber a notificação de TRANSACTION_NOTIFY_RM_DISCONNECTED, que receberão se o gerenciador de recursos que está tratando a operação de confirmação de fase única fechar o identificador de inscrição sem indicar que ele confirmou ou reverteu a transação.
Operações de confirmação de várias fases
Uma operação de confirmação de várias fases começa quando ocorre um dos seguintes eventos:
Um cliente transacional chama ZwCommitTransaction e nenhum gerenciador de recursos se registrou para receber TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT notificações.
Um gerenciador de recursos chama ZwSinglePhaseReject depois de receber uma notificação de TRANSACTION_NOTIFY_SINGLE_PHASE_COMMIT.
Um gerenciador de transações superior chama ZwPrepareEnlistment.
As operações de confirmação de várias fases consistem em três fases sequenciais: pré-preparação, preparação e confirmação.
Fase de pré-preparação
A fase de pré-preparação (também conhecida como fase zero) da operação de confirmação começa quando o KTM envia uma notificação de TRANSACTION_NOTIFY_PREPREPARE para todos os gerenciadores de recursos. A KTM enviará essa notificação se nenhum gerenciador de recursos der suporte a uma operação de confirmação de fase única para a transação ou se um gerenciador de transações superior chamar ZwPrePrepareEnlistment.
Quando cada gerenciador de recursos recebe a notificação TRANSACTION_NOTIFY_PREPREPARE, ele deve fazer o seguinte:
Libere todos os dados que ele está mantendo em um cache não permanente (armazenamento na memória), como a área de marshaling do CLFS para um fluxo de log CLFS.
O gerenciador de recursos deve mover os dados do cache para um meio de armazenamento durável. Por exemplo, um gerenciador de recursos que está usando CLFS pode chamar ClfsFlushBuffers.
Chame ZwPreprepareComplete.
Depois que um gerenciador de recursos tiver chamado ZwPreprepareComplete, ele poderá continuar a receber e atender às solicitações do cliente. Mas o gerenciador de recursos deve tratar todas as modificações de dados como operações de passagem de cache que são gravadas imediatamente em um meio de armazenamento durável.
Se um gerenciador de recursos encontrar um erro enquanto estiver processando uma notificação de TRANSACTION_NOTIFY_PREPREPARE, ele deverá chamar ZwRollbackEnlistment para reverter a transação.
Fase de Preparação
A fase de preparação (também conhecida como fase um) da operação de confirmação começa quando o KTM envia uma notificação de TRANSACTION_NOTIFY_PREPARE para todos os gerenciadores de recursos. A KTM envia essa notificação após TRANSACTION_NOTIFY_PREPREPARE se nenhum gerenciador de recursos der suporte à confirmação de fase única ou se um gerenciador de transações superior chamar ZwPrepareEnlistment.
Quando cada gerenciador de recursos recebe a notificação TRANSACTION_NOTIFY_PREPARE, ele deve fazer o seguinte:
Pare de atender solicitações do cliente e relate as solicitações subsequentes do cliente como erros do cliente.
Verifique se todos os dados foram movidos para o armazenamento durável.
Chame ZwPrepareComplete.
Se um gerenciador de recursos encontrar um erro enquanto estiver processando uma notificação de TRANSACTION_NOTIFY_PREPARE, ele deverá chamar ZwRollbackEnlistment para reverter a transação. No entanto, o gerenciador de recursos não pode reverter a transação depois de ter chamado ZwPrepareComplete.
Fase de confirmação
A fase de confirmação (também conhecida como fase dois) da operação de confirmação começa quando o KTM envia uma notificação de TRANSACTION_NOTIFY_COMMIT para todos os gerenciadores de recursos. A KTM envia essa notificação após TRANSACTION_NOTIFY_PREPARE se nenhum gerenciador de recursos der suporte à confirmação de fase única ou se um gerenciador de transações superior chamar ZwCommitEnlistment.
Quando cada gerenciador de recursos recebe a notificação TRANSACTION_NOTIFY_COMMIT, ele deve fazer o seguinte:
Torne todas as alterações de dados permanentes e públicas (ou seja, visíveis para outras transações).
Normalmente, um gerenciador de recursos torna as alterações permanentes e públicas copiando os dados salvos da transação do fluxo de log para o armazenamento público e permanente do banco de dados. Para obter mais informações sobre como usar fluxos de log, consulte Usando fluxos de log com KTM.
Chame ZwCommitComplete.
Depois que o gerenciador de recursos chamar ZwCommitComplete, ele deverá chamar ZwClose para fechar o identificador de inscrição.
Se um gerenciador de recursos encontrar um erro enquanto estiver processando uma notificação de TRANSACTION_NOTIFY_COMMIT, ele deverá se desligar. Na próxima vez que o sistema operacional recarregar o gerenciador de recursos, o processo de recuperação do gerenciador de recursos deverá restaurar a transação para um estado conhecido por ser bom antes do erro ocorrer.