Otimização usando Confirmação Monofásica e Notificação Monofásica Promocional
Este tópico descreve os mecanismos fornecidos pela infraestrutura para otimizar o System.Transactions desempenho.
Alistamento monofásico promocional
A System.Transactions infraestrutura administra uma transação dentro de um único domínio de aplicativo que envolve, no máximo, um único recurso durável ou vários recursos voláteis. Como a System.Transactions infraestrutura usa apenas chamadas de domínio dentro do aplicativo, ela produz a melhor taxa de transferência e desempenho.
No entanto, se a transação for fornecida a outro objeto em outro domínio de aplicativo (inclusive entre limites de processo e máquina) no mesmo computador, ou se você recrutar outro gerenciador de recursos durável, a System.Transactions infraestrutura escalará automaticamente a transação para ser gerenciada pelo MSDTC. Uma transação gerenciada pelo MSDTC não é tão eficiente quanto uma gerenciada System.Transactions pela infraestrutura.
Para otimizar o desempenho, a System.Transactions infraestrutura fornece o Promotable Single Phase Enlistment (PSPE) que permite que um único recurso remoto durável, localizado em um domínio, processo ou máquina de aplicativo diferente, participe de uma System.Transactions transação sem fazer com que ela seja escalada para uma transação MSDTC. Esse gerenciador de recursos (RM) pode hospedar e "possuir" uma transação que pode ser escalada posteriormente para uma transação distribuída (ou transação MSDTC), se necessário. Isso reduz a chance de usar o MSDTC.
Esse gerenciador de recursos específico geralmente tem suas próprias transações internas não distribuídas e precisa oferecer suporte à conversão dessas transações em transações distribuídas em tempo de execução. Por exemplo, o SQL Server 2005 é um gerenciador de recursos. Nesse caso, a System.Transactions infraestrutura assume um papel de gerenciamento passivo, apenas monitorando a transação para uma necessidade de escalonamento. Para apoiar a interação entre a infraestrutura e o System.Transactions gestor de recursos, este último necessita de implementar a interface IPromotableSinglePhaseNotification.
O EnlistPromotableSinglePhase método é usado para recrutar um único recurso durável que pode ser escalado posteriormente. Esse método garante que o alistamento possa ser escalado conforme necessário. Se o alistamento for bem-sucedido, o RM cria sua transação interna e a associa à System.Transactions transação. Se o alistamento PSPE falhar, o RM deve, em vez disso, alistar-se usando o EnlistDurable método. As falhas no alistamento no PSPE podem acontecer quando a transação já é uma transação distribuída ou quando outro RM já realizou um alistamento PSPE
Uma vez alistadas, as chamadas feitas pelos clientes para confirmar ou anular a System.Transactions transação são convertidas em chamadas no Gerenciador de Recursos invocando o SinglePhaseCommit método ou o Rollback método respectivamente.
Se a System.Transactions transação nunca exigir escalonamento, quando a transação for confirmada, o RM receberá uma SinglePhaseCommit notificação. Em seguida, ele pode confirmar a transação interna que foi criada inicialmente.
Se a System.Transactions transação precisar ser escalada (por exemplo, para suportar vários RMs), System.Transactions informa o gerenciador de recursos chamando o Promote método na interface, do ITransactionPromoter qual a IPromotableSinglePhaseNotification interface deriva. Em seguida, o gerenciador de recursos converte a transação internamente de uma transação local (que não requer registro) em um objeto de transação capaz de participar de uma transação DTC e a associa ao trabalho já realizado. Quando a transação é solicitada a confirmar, o gerenciador de transações ainda envia a SinglePhaseCommit notificação para o gerenciador de recursos, que confirma a transação distribuída criada durante o escalonamento.
Nota
Os rastreamentos TransactionCommitted (que são gerados quando um Commit é invocado na transação escalada) contêm a ID de atividade da transação DTC.
Para obter mais informações sobre escalonamento de gerenciamento, consulte Escalonamento de gerenciamento de transações.
Cenário de escalonamento do gerenciamento de transações
O cenário a seguir demonstra um escalonamento para uma transação distribuída usando o System.Data namespace como o 'proxy' para o gerenciador de recursos. Esse cenário pressupõe que já há uma System.Data conexão com o banco de dados, CN1, envolvida na transação, e o aplicativo deseja envolver outra System.Data conexão, CN2. A transação deve ser escalada para DTC, como uma transação de confirmação de duas fases totalmente distribuída.
Neste cenário,
CN1 chama o EnlistPromotableSinglePhase método para se alistar na transação. Então, a transação ainda é local e não há outros alistamentos promocionais na transação, então a EnlistPromotableSinglePhase chamada é bem-sucedida.
Quando a segunda conexão, CN2 chama EnlistPromotableSinglePhase, a chamada falha porque há outro alistamento promocional envolvido. Devido a isso, CN2 deve obter uma transação DTC para passá-lo para SQL. Para fazer isso, ele usa um dos métodos fornecidos pela TransactionInterop classe para produzir um formato da transação que pode ser dado ao SQL.
System.Transactions chama o Promote método na interface implementada ITransactionPromoter pelo CN1.
Neste ponto, o CN1 escalona a transação, usando algum mecanismo específico para SQL 2005 e System.Data.
O valor de retorno do método é uma matriz de Promote bytes que contém um token de propagação para a transação. System.Transactions usa esse token de propagação para criar uma transação DTC que ele pode incorporar na transação local.
Neste ponto, CN2 pode usar os dados recebidos de chamar um dos métodos por para passar a transação para TransactionInterop SQL.
Agora, ambos estão inscritos em uma transação distribuída DTC.
Otimização de confirmação monofásica
O protocolo Single Phase Commit é mais eficiente em tempo de execução, pois todas as atualizações são feitas sem qualquer coordenação explícita. Para aproveitar essa otimização, você deve implementar um gerenciador de recursos usando ISinglePhaseNotification a interface para o recurso e se alistar em uma transação usando o EnlistDurable método or EnlistVolatile . Especificamente, o parâmetro EnlistmentOptions deve ser igual a None garantir que uma confirmação de fase única seja executada.
Como a interface deriva da interface, se o ISinglePhaseNotification IEnlistmentNotification seu RM não estiver qualificado para confirmação de fase única, ele ainda poderá receber as notificações de confirmação de duas fases. Se o seu RM receber uma SinglePhaseCommit notificação da TM, ele deve tentar fazer o trabalho necessário para que ele se comprometa e, correspondentemente, informar o gerente de transações se a transação deve ser confirmada ou revertida chamando o CommittedAborted, ou InDoubt método no SinglePhaseEnlistment parâmetro. Uma resposta de Done sobre o alistamento nesta fase implica semântica ReadOnly. Portanto, você não deve responder Done além de qualquer um dos outros métodos.
Se houver apenas um alistamento volátil e nenhum alistamento duradouro, o alistamento volátil recebe notificação do CCP. Se houver alistamentos voláteis e apenas um alistamento durável, os alistamentos voláteis recebem 2PC. Quando concluído, o alistamento durável recebe o SPC.