Compartilhar via


Executar a recuperação

Um Gerenciador de recursos facilita a resolução de inscrições duráveis em uma transação, reenlisting o participante de transação após falha de recurso.

O processo de recuperação

Para inscrever permanentemente um recurso (descrito por uma implementação do IEnlistmentNotification interface) que podem ser mais tarde qualificadas para a recuperação, você deve chamar o EnlistDurable método. 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 que é fornecido para a chamada inicial do Enlist deve ser idêntico ao parâmetro resourceManagerIdentifier na chamada de Reenlist durante a recuperação. Caso contrário, TransactionException é lançada. Para obter mais informações sobre alistamentos duráveis, consulte Como inscrever 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 o Prepare notificação, ele deve registrar seu registro de preparação durante essa fase. O registro deve conter todas as informações necessárias para concluir a transação no commit. O registro de preparação mais tarde pode ser acessado durante a recuperação, recuperando a propriedade RecoveryInformation do retorno de chamada preparingEnlistment. O log de registro não precisa ser executada dentro do Prepare método como o Gerenciador de recursos pode fazer isso em um thread de trabalho.

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

Etapa 1 – ReEnlist

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

Para cada alistamento que examina, ele invoca Reenlist no gerenciador de transações. Esse método passa exclusivo Guid que identifica o Gerenciador de recursos, bem como informações da inscrição em uma matriz de bytes. Um novo Enlistment objeto é retornado. Se na nova inscrição falhará com uma exceção, o Gerenciador de recursos será necessário tentar novamente mais tarde.

Você deve chamar o método Reenlist somente quando um gerenciador de recursos for reiniciado depois de uma falha. Além disso, você só deve reinscrevê registradas por um Gerenciador de recursos durante a fase de preparação inicial de protocolo 2PC de transações não resolvidas. Qualquer tentativa de chamar esse método em momentos inválidos pode produzir resultados incorretos.

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

Etapa 2 – Concluir a recuperação

Quando todas as listas de reenlistamentos forem concluídas, o gerenciador de recursos chamará o método RecoveryComplete. Esse método conclui a recuperação e informa ao gerenciador de transações que o gerenciador de recursos não tem mais transações em dúvida. Ao fazer isso, o gerenciador de recursos garante que ele não invocará o Reenlist método novamente.

Um gerenciador de recursos não precisa resolver todas as transações pendentes antes de participar de novas transações. A primeira etapa pode ser executada a qualquer momento após o gerenciador de recursos estabelecer uma relação 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.