Compartilhar via


Implementando um Gerenciador de Recursos

Cada recurso usado em uma transação é gerenciado por um gerenciador de recursos, cujas ações são coordenadas por um gerenciador de transações. Os gerenciadores de recursos trabalham em cooperação com o gerenciador de transações para fornecer ao aplicativo uma garantia de atomicidade e isolamento. Microsoft SQL Server, filas de mensagens duráveis, tabelas de hash na memória são todos exemplos de gerenciadores de recursos.

Um gerenciador de recursos gerencia dados duráveis ou voláteis. A durabilidade (ou, por outro lado, a volatilidade) de um gerenciador de recursos refere-se a se o gerenciador de recursos dá suporte à recuperação de falhas. Se um gerenciador de recursos der suporte à recuperação de falhas, ele persistirá os dados para o armazenamento durável durante a Fase1 (preparação) de modo que, se o gerenciador de recursos falhar, ele poderá se inscrever novamente na transação após a recuperação e executar as ações adequadas com base nas notificações recebidas do gerenciador de transações. Em geral, os gerenciadores de recursos voláteis gerenciam recursos voláteis, como uma estrutura de dados na memória (por exemplo, um transacted-hashtable na memória) e os gerenciadores de recursos duráveis gerenciam recursos que têm um repositório de backup mais persistente (por exemplo, um banco de dados cujo repositório de backup é disco).

Para que um recurso participe de uma transação, ele deve se inscrever na transação. A Transaction classe define um conjunto de métodos cujos nomes começam com Enlist que fornecem essa funcionalidade. Os métodos diferentes Enlist correspondem aos diferentes tipos de inscrição que um gerenciador de recursos pode ter. Especificamente, você usa os EnlistVolatile métodos para recursos voláteis e o EnlistDurable método para recursos duráveis. Para simplificar, após decidir se deseja usar o método EnlistDurable ou EnlistVolatile com base no suporte de durabilidade do seu recurso, você deve inscrever seu recurso para participar da Confirmação de Duas Fases (2PC) implementando a interface IEnlistmentNotification para o seu gerenciador de recursos. Para obter mais informações sobre o 2PC, consulte Confirmação de uma Transação de Fase Única e de Várias Fases.

Inscrevendo, o Gerenciador de recursos garante que ele obtém retornos de chamada do Gerenciador de transações quando a transação é confirmada ou anulada. Há uma instância de IEnlistmentNotification por inscrição. Normalmente, há uma inscrição por transação, mas um gerenciador de recursos pode optar por se inscrever várias vezes na mesma transação.

Após a inscrição, o gerenciador de recursos responde às solicitações da transação. Um gerenciador de recursos durável armazena informações suficientes para permitir que ele desfaça ou refaça o trabalho da transação nos recursos que gerencia. Há muitas maneiras de fazer isso; manter versões de dados ou manter um log das alterações são duas técnicas comuns.

Quando o aplicativo confirma a transação, o gerenciador de transações inicia o protocolo de confirmação em duas fases. O gerenciador de transações primeiro pergunta a cada gerenciador de recursos inscrito se ele está preparado para confirmar a transação. O Gerenciador de recursos deve preparar para confirmar — ele se prepara para confirmar ou anular a transação.

Durante a fase de preparação, o gerenciador de recursos durável registra os dados antigos e novos no armazenamento estável para que o gerenciador de recursos possa recuperá-los mesmo que o sistema falhe. Se o gerenciador de recursos puder se preparar, ele informará ao gerenciador de transações seu voto sobre a confirmação ou anulação da transação. Se qualquer gerenciador de recursos reportar uma falha na preparação, o gerenciador de transações enviará um comando de rollback para cada gerenciador de recursos e informará ao aplicativo sobre a falha na confirmação.

Quando preparado, um Gerenciador de recursos deve esperar até obter uma confirmação ou anulação de retorno de chamada do Gerenciador de transações na fase 2. Normalmente, todo o protocolo de preparação e confirmação é concluído em uma fração de segundo. Se houver falhas de sistema ou comunicação, a notificação de confirmação ou anulação poderá não chegar por minutos ou horas. Durante esse período, o gerenciador de recursos está em dúvida sobre o resultado da transação. Ele não sabe se a transação foi confirmada ou anulada. Embora o gerenciador de recursos esteja em dúvida sobre uma transação, ele mantém os dados modificados mantendo a transação bloqueada, isolando essas alterações de qualquer outra transação.

Quando um gerenciador de recursos falha, todas as transações inscridas são anuladas, exceto aquelas preparadas ou confirmadas antes da falha. Quando um Gerenciador de recursos durável é reiniciado, reconstrói o estado confirmado os recursos que ele gerencia recuperando as informações de preparação gravadas na fase de preparação, e confirma ou anula essas transações de forma adequada.

Em resumo, o protocolo de confirmação em duas fases e os gerenciadores de recursos combinam-se para tornar as transações atômicas e duráveis.

O Transaction classe também fornece o EnlistPromotableSinglePhase método para inscrever um podem ser promovidas única fase de inscrição (PSPE). Isso permite que um RM (gerenciador de recursos durável) hospede e "possua" uma transação que pode ser escalonada posteriormente para ser gerenciada pelo MSDTC, se necessário. Para obter mais informações, consulte Otimização usando Confirmação de Fase Única e Notificação de Fase Única Passível de Promoção.

Nesta seção

As etapas geralmente seguidas por um gerenciador de recursos são descritas nos tópicos a seguir.

Inscrição de recursos como participantes em uma transação

Descreve como um recurso durável ou volátil pode se inscrever em uma transação.

Confirmar uma transação de fase única e de várias fases

Descreve como um gerenciador de recursos responde à notificação de confirmação e prepara a confirmação.

Executar a recuperação

Descreve como um gerenciador de recursos durável se recupera de uma falha.

Níveis de confiança de segurança no acesso a recursos

Descreve como os três níveis de confiança para System.Transactions restringem o acesso aos tipos de recursos que System.Transactions expõem.

Otimização usando commit de fase única e notificação de fase única promovível

Descreve as práticas de otimização disponíveis para implementações de gerenciadores de recursos.