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 de forma durável um recurso (descrito por uma implementação da interface) que possa ser qualificado IEnlistmentNotification posteriormente para 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 Enlist inicial deve ser idêntico ao parâmetro resourceManagerIdentifier na chamada durante a Reenlist recuperação. Caso contrário, TransactionException é jogado. 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 registro prepare pode ser acessado posteriormente durante a recuperação, recuperando a RecoveryInformation propriedade do retorno de chamada preparingEnlistment. O log de registros não precisa ser executado dentro do método, Prepare pois o RM pode fazer isso em um thread de trabalho.

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

Passo 1 - ReEnlist

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 RecoveryInformation PreparingEnlistment propriedade do retorno de chamada, que é passado para o gerente de recursos na notificação durante a Prepare fase 1.

Para cada alistamento que examina, invoca o gestor de Reenlist 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 gestor de recursos terá de repetir mais tarde.

Você só deve chamar o Reenlist método quando um gerenciador de recursos for reiniciado a partir de uma falha. Além disso, você só deve relistar transações não resolvidas registradas por um gerente de recursos durante a fase inicial Preparar 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 é relistado usando este método, os métodos de IEnlistmentNotification fase 2 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 gerenciador de recursos chama o RecoveryComplete método. 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.