Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este tópico descreve os mecanismos fornecidos pela infraestrutura para otimizar o System.Transactions desempenho.
Inscrição de fase única passíveis de promoção
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 intra-aplicativo, ela gera a melhor taxa de transferência e desempenho.
No entanto, se a transação for transferida para outro objeto em um domínio de aplicativo diferente (incluindo através de limites de processo e máquina) no mesmo computador, ou se você precisar registrar outro gerenciador de recursos duráveis, a infraestrutura System.Transactions automaticamente escalona a transação para ser gerenciada pelo MSDTC. Uma transação gerenciada pelo MSDTC não tem o mesmo desempenho que uma gerenciada pela infraestrutura System.Transactions.
Para otimizar o desempenho, a infraestrutura System.Transactions oferece o PSPE (Promotable Single Phase Enlistment), que permite que um único recurso durável remoto, localizado em um domínio de aplicativo, processo ou máquina diferente, participe de uma System.Transactions transação sem que ela seja escalonada para uma transação MSDTC. Esse RM (gerenciador de recursos) pode hospedar e "possuir" uma transação que pode ser escalonada 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 dar suporte à conversão dessas transações em transações distribuídas em runtime. Por exemplo, o SQL Server 2005 é um gerenciador de recursos. Nesse caso, a System.Transactions infraestrutura desempenha um papel de gerenciamento passivo, limitando-se a monitorar a transação para identificar a necessidade de escalonamento. Para dar suporte à interação entre a infraestrutura e o System.Transactions gerenciador de recursos, este ú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 possa ser escalonada conforme necessário. Se a inscrição for bem-sucedida, a RM criará a sua transação interna e a associará à transação System.Transactions. Se a inscrição PSPE falhar, o Gerenciador de recursos em vez disso, deve inscrever usando o EnlistDurable método. Falhas ao se inscrever no PSPE podem ocorrer quando a transação já for uma transação distribuída ou quando outra RM já tiver realizado uma inscrição 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 pode confirmar a transação interna que foi criada inicialmente.
Se a System.Transactions transação precisar ser escalonada (por exemplo, para dar suporte a várias RMs), System.Transactions informará o gerenciador de recursos chamando o Promote método na ITransactionPromoter interface, da 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 log) em um objeto de transação capaz de participar de uma transação DTC e a associa ao trabalho já feito. Quando a transação é solicitada a se 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.
Observação
Os TransactionCommitted rastreamentos (que são gerados quando um Commit é invocado na transação escalonada) contêm o identificador da atividade da transação do DTC.
Para obter mais informações sobre o escalonamento de gerenciamento, consulte Escalonamento do 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. Esse cenário pressupõe que já exista 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 o DTC, como uma transação de confirmação de duas fases distribuída completa.
Nesse cenário,
CN1 chama o método EnlistPromotableSinglePhase para participar da 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, o CN2 deve obter uma transação DTC para passá-la para o SQL. Para fazer isso, ele usa um dos métodos fornecidos pela TransactionInterop classe para produzir um formato da transação que pode ser fornecido ao SQL.
System.Transactions chama o Promote método na ITransactionPromoter interface implementada por CN1.
Neste ponto, a CN1 escalona a transação, usando algum mecanismo específico do SQL 2005 e System.Data.
O valor retornado do Promote método é uma matriz de 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 pode incorporar à transação local.
Neste ponto, a CN2 pode usar os dados recebidos da chamada de um dos métodos TransactionInterop para passar a transação para o 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 no runtime, pois todas as atualizações são feitas sem nenhuma coordenação explícita. Para aproveitar essa otimização, você deve implementar um gerenciador de recursos usando a interface ISinglePhaseNotification para o recurso e registrar-se em uma transação usando o método EnlistDurable ou EnlistVolatile. Especificamente, o parâmetro EnlistmentOptions deve ser igual a None para garantir que um commit de fase única seja executado.
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 nenhum dos outros métodos.
Se houver apenas uma alocação volátil e nenhuma alocação durável, a alocação volátil receberá uma 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.