Manipulando operações de recuperação

Em uma operação de recuperação , um TPS (sistema de processamento de transações) tenta recuperar seu estado das informações que estão em fluxos de log. Depois que uma operação de recuperação for concluída, todas as transações deverão estar em um estado confirmado ou revertido e todos os dados de recurso deverão estar em um estado válido conhecido.

Às vezes, um TPS é interrompido antes que todas as transações tenham sido concluídas. Por exemplo, o sistema operacional pode falhar. Portanto, os gerenciadores de recursos devem iniciar operações de recuperação sempre que começarem a ser executados. A operação de recuperação tenta determinar se as transações estão incompletas. Se transações incompletas forem encontradas no log, a operação de recuperação tentará confirmar ou reverter essas transações.

Para um TPS baseado em KTM, cada operação de recuperação consiste em duas etapas. A primeira etapa envolve a recuperação de informações do fluxo de log do objeto do gerenciador de transações. A segunda etapa envolve a recuperação de informações do fluxo de log do gerenciador de recursos.

Um TPS pode se recuperar até o final de todos os fluxos de log ou, se seus gerenciadores de recursos mantiverem valores de relógio virtual, ele poderá recuperar até um valor de relógio especificado.

Recuperando informações do fluxo de log de um objeto do Gerenciador de Transações

Imediatamente após um gerenciador de recursos chamar ZwCreateTransactionManager ou ZwOpenTransactionManager, ele deverá chamar ZwRecoverTransactionManager. A rotina ZwRecoverTransactionManager lê o fluxo de log que pertence ao objeto do gerenciador de transações. Essa rotina reconstrói o estado do objeto do gerenciador de transações (incluindo todas as transações, inscrições e gerenciadores de recursos) das informações de recuperação que estão no fluxo de log, começando na última área de reinicialização que o KTM criou e terminou no final do fluxo.

Para recuperar da última área de reinicialização até um valor de relógio virtual especificado, o gerenciador de recursos pode chamar ZwRollforwardTransactionManager em vez de ZwRecoverTransactionManager.

Recuperando informações do fluxo de log de um Resource Manager

Imediatamente após um gerenciador de recursos chamar ZwCreateResourceManager ou ZwOpenResourceManager, ele deverá chamar ZwRecoverResourceManager. A rotina ZwRecoverResourceManager tenta recuperar as transações associadas a cada uma das inscrições do gerenciador de recursos.

Quando um gerenciador de recursos chama ZwRecoverResourceManager, o KTM envia TRANSACTION_NOTIFY_RECOVER notificações para cada uma das inscrições do gerenciador de recursos. O gerenciador de recursos deve chamar ZwRecoverEnlistment sempre que receber uma das notificações de TRANSACTION_NOTIFY_RECOVER.

Quando o gerenciador de recursos chama ZwRecoverEnlistment, o KTM envia uma das seguintes notificações:

  • TRANSACTION_NOTIFY_COMMIT

    O gerenciador de recursos deve usar informações em seu fluxo de log para confirmar a transação e, em seguida, deve chamar ZwCommitComplete.

  • TRANSACTION_NOTIFY_ROLLBACK

    O gerenciador de recursos deve usar informações em seu fluxo de log para reverter a transação e, em seguida, deve chamar ZwRollbackComplete.

  • TRANSACTION_NOTIFY_INDOUBT

    A KTM não determinou o estado da transação e enviará uma notificação de confirmação ou reversão mais tarde.

Normalmente, o KTM envia uma notificação de TRANSACTION_NOTIFY_COMMIT se determinar que todos os gerenciadores de recursos chamados ZwPrepareComplete antes do TPS parar e reiniciar. O KTM enviará uma notificação de TRANSACTION_NOTIFY_ROLLBACK se determinar que um ou mais gerenciadores de recursos não chamaram ZwPrepareComplete.

Depois que a KTM enviar uma notificação de TRANSACTION_NOTIFY_RECOVER para cada inscrição, ela enviará uma notificação de TRANSACTION_NOTIFY_LAST_RECOVER.

Se o gerenciador de recursos chamou ZwRollforwardTransactionManager em vez de ZwRecoverTransactionManager, ele deverá recuperar somente até o valor do relógio virtual especificado para ZwRollforwardTransactionManager.

Os gerenciadores de recursos podem chamar ZwSetInformationEnlistment para definir informações de recuperação personalizadas. A KTM salva essas informações e as grava no fluxo de log, mas a KTM não tenta interpretar as informações. O gerenciador de recursos pode recuperar as informações de recuperação a qualquer momento chamando ZwQueryInformationEnlistment.

Os gerenciadores de transações superiores às vezes recebem TRANSACTION_NOTIFY_RECOVER_QUERY notificações durante uma operação de recuperação.