Partilhar via


Executando a recuperação

Um gerente de recursos facilita a resolução de alistamentos duráveis em uma transação ao reinscrever o participante da transação após uma falha de recurso.

O processo de recuperação

Para inscrever duradouramente um recurso (descrito por uma implementação da interface IEnlistmentNotification) que possa ser qualificado posteriormente para recuperação, deve chamar o método EnlistDurable. Além disso, você deve fornecer ao EnlistDurable método um identificador do gerenciador de recursos (a Guid) que é usado para rotular consistentemente o participante da transação no caso de uma falha de recurso. Por esse motivo, o Guid fornecido para a chamada inicial Enlist deve ser idêntico ao parâmetro resourceManagerIdentifier na chamada Reenlist durante a recuperação. Caso contrário, TransactionException é lançado. Para obter mais informações sobre alistamentos duráveis, consulte Recrutando recursos como participantes de uma transação.

Na fase de preparação (fase 1) do protocolo 2PC, quando sua implementação de um gerenciador de recursos duráveis recebe a Prepare notificação, ele deve registrar seu registro de preparação durante essa fase. O registo deve conter todas as informações necessárias para concluir a transação no momento da confirmação. O registo de preparação pode ser acessado posteriormente durante a recuperação, acessando a propriedade RecoveryInformation do retorno de chamada preparingEnlistment. O registo dos logs não precisa ser executado dentro do método Prepare já que o RM pode fazer isso em um thread de trabalhador.

O processo de recuperação consiste nas duas etapas seguintes:

Passo 1 - Realizar novo alistamento

O gerente de recursos examina o registro de informações de preparação para cada alistamento que está em dúvida. Isso é feito examinando a propriedade RecoveryInformation do PreparingEnlistment retorno de chamada, que é passada para o gerente de recursos na notificação durante a fase Prepare 1.

Para cada alistamento que examina, invoca Reenlist no gestor de transações. Esse método transmite um exclusivo Guid que identifica o gerenciador de recursos, bem como as informações do alistamento em uma matriz de bytes. Um novo Enlistment objeto é retornado. Se o realistamento falhar com uma exceção, o gerente de recursos terá de tentar novamente mais tarde.

Você só deve chamar o método Reenlist quando um gestor de recursos for reiniciado após uma falha. Além disso, deve apenas relistar transações não resolvidas registadas por um gestor de recursos durante a fase inicial de Pré-preparação de uma confirmação de duas fases. Qualquer tentativa de chamar esse método em momentos inválidos pode produzir resultados errados.

Quando um participante é reinscrito usando este método, os métodos da fase 2 de IEnlistmentNotification que correspondem ao resultado da transação (ou seja, Commit, Rollback ou InDoubt) são chamados conforme apropriado.

Passo 2 - Completar a recuperação

Quando todos os realistamentos são concluídos, o gerente de recursos chama o método RecoveryComplete. Esse método conclui a recuperação e informa ao gerente de transações que o gerenciador de recursos não tem mais transações duvidosas. Ao fazer isso, o gerente de recursos garante que não invocará o Reenlist método novamente.

Um gestor de recursos não é obrigado a resolver todas as transações em dúvida antes de se inscrever em novas transações. A primeira etapa pode ser executada a qualquer momento após o gerente de recursos estabelecer um relacionamento com o gerenciador de transações, mas depois RecoveryComplete de ter sido invocada (etapa 2), a etapa 1 não pode ser executada novamente. A etapa 2 pode ser repetida várias vezes sem afetar o resultado das transações.