Otimização usando commit de fase única e notificação de fase única promovível
Este tópico descreve os mecanismos fornecidos pelo System.Transactions infra-estrutura para otimizar o desempenho.
Inscrição de fase única passíveis de promoção
O System.Transactions infra-estrutura administrates uma transação dentro de um único domínio de aplicativo que envolve a no máximo um único recurso durável ou vários recursos voláteis. Como o System.Transactions infra-estrutura usa chamadas de domínio apenas intra-aplicativo, ele produz a melhor taxa de transferência e o desempenho.
No entanto, se a transação é fornecida a outro objeto em outro domínio de aplicativo (incluindo entre limites de processo e da máquinas) no mesmo computador, ou se você se inscrever outro gerenciador de recursos duráveis, o System.Transactions infra-estrutura aumenta automaticamente a transação a ser gerenciado pelo MSDTC. Uma transação gerenciada por MSDTC não é tão em termos de desempenho como um gerenciado pelo System.Transactions infra-estrutura.
Para otimizar o desempenho, o System.Transactions infra-estrutura fornece o podem ser promovidas única fase de inscrição (PSPE) que permite que um único durável recurso remoto, localizado em um domínio de aplicativo diferente, o processo ou a máquina, participe de um System.Transactions transação sem fazer com que ele ser escalonado para uma transação MSDTC. Esse Gerenciador de recursos (RM) pode hospedar e "proprietário" de uma transação que posteriormente pode ser escalonada para uma transação distribuída (ou transação MSDTC) se necessário. Isso reduz a possibilidade de usar o MSDTC.
O gerenciador de recursos específico normalmente 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 é tal um Gerenciador de recursos. Nesse caso, o System.Transactions infra-estrutura usa uma função de gerenciamento de passivo monitorando apenas a transação para uma necessidade de escalonamento. Para oferecer suporte a interação entre o System.Transactions infra-estrutura e Gerenciador de recursos, o último precisa implementar a interface IPromotableSinglePhaseNotification.
O EnlistPromotableSinglePhase método é usado para inscrever um único recurso durável que pode ser escalonado posteriormente. Esse método garante que a inscrição pode ser escalonada conforme necessário. Se a inscrição for bem-sucedida, o Gerenciador de recursos cria sua transação interna e o associa a System.Transactions transação. Se a inscrição PSPE falhar, o Gerenciador de recursos em vez disso, deve inscrever usando o EnlistDurable método. Falhas para se inscrever no PSPE podem acontecer quando a transação já for uma transação distribuída ou outro RM já executou uma inscrição de PSPE
Depois de inscrito, chamadas por clientes para confirmar ou anular a System.Transactions transação são convertidos em chamadas no Gerenciador de recursos, invocando o SinglePhaseCommit método, ou o Rollback respectivamente.
Se o System.Transactions transação nunca requer escalonamento, quando a transação é confirmada, o RM recebe um SinglePhaseCommit notificação. Em seguida, ele poderá confirmar a transação interna que foi inicialmente criada.
Se o System.Transactions transação deverá ser escalonado (por exemplo, para oferecer suporte a vários RMs), System.Transactions informa ao Gerenciador de recursos, chamando o Promote método no ITransactionPromoter interface, da qual o IPromotableSinglePhaseNotification interface deriva. O Gerenciador de recursos converte a transação interna de uma transação local (que não exigem registro em log) para um objeto de transação que é capaz de participar de uma transação do DTC e associa o trabalho já realizado. Quando a transação é solicitada a confirmar, o Gerenciador de transações ainda envia o SinglePhaseCommit notificação para o Gerenciador de recursos, que confirma a transação distribuída que criou durante a expansão.
Observação
Os rastreamentos TransactionCommitted (gerados quando uma Confirmação é invocada na transação escalada) contêm a ID de atividade de transação do DTC.
Para obter mais informações sobre escalonamento de transações, consulte o tópico Escalonamento no Gerenciamento de Transações.
Cenário de escalonamento de 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. Este cenário pressupõe que já existe um System.Data conexão com o banco de dados, CN1, envolvidos na transação e o aplicativo deseja envolver outro System.Data conexão, CN2. A transação deve ser escalada para o DTC, como uma transação de confirmação de duas fases distribuída completa.
Nesse cenário,
Chamadas de CN1 a EnlistPromotableSinglePhase método para se inscrever na transação. Em seguida, a transação é ainda local e não há nenhum inscrições podem ser promovidas na transação, para que o EnlistPromotableSinglePhase chamada for bem-sucedida.
Quando a segunda conexão, CN2 chama EnlistPromotableSinglePhase, a chamada falhará porque não há outra inscrição podem ser promovida envolvidas. Por isso, CN2 deve obter uma transação do DTC para passá-lo para SQL. Para fazer isso, ele usa um dos métodos fornecidos pelo TransactionInterop classe para produzir um formato da transação que pode ser determinado para SQL.
System.Transactions chama o método Promote na interface ITransactionPromoter implementada por CN1.
Neste ponto, CN1 aumenta a transação, usando um mecanismo específico para o SQL 2005 e System.Data.
O valor de retorno de Promote método é uma matriz de bytes que contém um token de propagação da transação. System.Transactions usa esse token de propagação para criar uma transação DTC que pode incorporar à transação local.
Neste ponto, CN2 pode usar os dados recebidos de chamar um dos métodos por TransactionInterop para passar a transação para SQL.
Agora, ambos estão inscritos em uma transação distribuída do DTC.
Otimização de confirmação de fase única
O protocolo de Confirmação de Fase Única é mais eficiente em tempo de execução, pois todas as atualizações são realizadas sem qualquer coordenação explícita. Para tirar proveito dessa otimização, você deve implementar um Gerenciador de recursos usando ISinglePhaseNotification para o recurso de interface e se inscrever em uma transação usando o EnlistDurable ou EnlistVolatile método. Especificamente, o parâmetro EnlistmentOptions deve ser igual ao parâmetro None para garantir a realização de uma confirmação de fase única.
Como o ISinglePhaseNotification interface deriva de IEnlistmentNotification a interface, se o RM não está qualificado para confirmação de fase única, ele pode ainda receber a fase de duas notificações de confirmação. Se receber o RM um SinglePhaseCommit notificação do TM, ele deve tentar fazer o trabalho necessário para confirmar e proporcionalmente informam o Gerenciador de transações se a transação deve ser confirmada ou revertida chamando o Committed, Aborted, ou InDoubt método o SinglePhaseEnlistment parâmetro. Uma resposta de Done sobre a inscrição neste estágio implica a semântica de somente leitura. Portanto, você não deve responder Done além de qualquer um dos outros métodos.
Se só houver uma inscrição volátil e nenhuma durável, a inscrição volátil receberá notificação de SPC. Se houver inscrições voláteis e somente uma durável, as inscrições voláteis receberão 2PC. Quando ele for concluído, a distribuição durável recebe SPC.