Implementando um Gerenciador de Recursos
Cada recurso usado em uma transação é gerenciado por um gerente de recursos, cujas ações são coordenadas por um gerente de transações. Os gerentes de recursos trabalham em cooperação com o gerente 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 exemplos de gerenciadores de recursos.
Um gestor de recursos gere dados duradouros ou voláteis. A durabilidade (ou, inversamente, a volatilidade) de um gestor de recursos refere-se ao facto de o gestor de recursos suportar a recuperação de falhas. Se um gerenciador de recursos oferecer suporte à recuperação de falhas, ele persistirá os dados para armazenamento durável durante a Fase 1 (preparação), de modo que, se o gerenciador de recursos ficar inativo, ele poderá se alistar novamente na transação após a recuperação e executar as ações apropriadas com base nas notificações recebidas do gerenciador de transações. Em geral, os gerentes de recursos voláteis gerenciam recursos voláteis, como uma estrutura de dados na memória (por exemplo, um hashtable transacionado na memória), e os gerenciadores de recursos duráveis gerenciam recursos que têm um armazenamento de backup mais persistente (por exemplo, um banco de dados cujo armazenamento de backup é disco).
Para que um recurso participe de uma transação, ele deve se alistar na transação. A Transaction classe define um conjunto de métodos cujos nomes começam com Enlist que fornecem essa funcionalidade. Os diferentes métodos Enlist correspondem aos diferentes tipos de alistamento que um gerente 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, depois de decidir se deseja usar o EnlistDurable método ou EnlistVolatile com base no suporte de durabilidade do seu recurso, você deve recrutar seu recurso para participar do Two Phase Commit (2PC) implementando a interface para seu IEnlistmentNotification gerenciador de recursos. Para obter mais informações sobre o 2PC, consulte Confirmando uma transação em monofásica e multifásica.
Ao se alistar, o gerenciador de recursos garante que recebe retornos de chamada do gerenciador de transações quando a transação é confirmada ou anulada. Há um caso de IEnlistmentNotification alistamento. Normalmente, há um alistamento por transação, mas um gerente de recursos pode optar por se alistar várias vezes na mesma transação.
Após o alistamento, o gerente de recursos responde às solicitações da transação. Um gerenciador de recursos duráveis 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 dos dados ou manter um registo 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 gerente de recursos alistado se ele está preparado para confirmar a transação. O gestor de recursos deve preparar-se para confirmar — prepara-se para confirmar ou anular a transação.
Durante a fase de preparação, o gerenciador de recursos duráveis registra os dados antigos e novos em armazenamento estável para que o gerenciador de recursos possa recuperá-los mesmo se o sistema falhar. Se o gestor de recursos puder preparar-se, informa o gestor de transações do seu voto sobre a confirmação ou anulação da transação. Se algum gerente de recursos relatar uma falha na preparação, o gerenciador de transações enviará um comando de reversão para cada gerente de recursos e indicará a falha da confirmação no aplicativo.
Uma vez preparado, um gerente de recursos deve aguardar até receber um retorno de chamada de confirmação ou anulação 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 no sistema ou na comunicação, a notificação de confirmação ou anulação pode não chegar por minutos ou horas. Durante este período, o gestor de recursos está em dúvida sobre o resultado da transação. Não sabe se a transação foi confirmada ou abortada. Enquanto o gerente de recursos está em dúvida sobre uma transação, ele mantém os dados modificados mantendo a transação bloqueada, isolando assim essas alterações de quaisquer outras transações.
Quando um gerenciador de recursos falha, todas as suas transações alistadas são anuladas, exceto aquelas que são preparadas ou confirmadas antes da falha. Quando um gerenciador de recursos duráveis é reiniciado, ele reconstrói o estado comprometido dos recursos que gerencia recuperando as informações de preparação escritas na fase de preparação e confirma ou anula essas transações de acordo.
Em resumo, o protocolo de confirmação em duas fases e os gerentes de recursos se combinam para tornar as transações atômicas e duráveis.
A Transaction classe também fornece o EnlistPromotableSinglePhase método para recrutar um alistamento monofásico promocional (PSPE). Isso permite que um gerenciador de recursos duráveis (RM) hospede e "possua" uma transação que pode ser escalada posteriormente para ser gerenciada pelo MSDTC, se necessário. Para obter mais informações sobre isso, consulte Otimização usando confirmação monofásica e Notificação monofásica promocional.
Nesta Secção
As etapas geralmente seguidas por um gerente de recursos são descritas nos tópicos a seguir.
Recrutando recursos como participantes de uma transação
Descreve como um recurso durável ou volátil pode se alistar em uma transação.
Confirmando uma transação em monofásica e multifásica
Descreve como um gerente de recursos responde à notificação de confirmação e prepara a confirmação.
Descreve como um gerenciador de recursos duráveis 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 nos tipos de recursos expostos System.Transactions .
Otimização usando Confirmação Monofásica e Notificação Monofásica Promocional
Descreve as práticas de otimização disponíveis para implementações de gerentes de recursos.