Escalonamento de gerenciamento de transações
O Windows hospeda um conjunto de serviços e módulos que, juntos, constituem um gerenciador de transações. O escalonamento de gerenciamento de transações descreve o processo de migração de uma transação de um dos componentes do gerenciador de transações para outro.
System.Transactions Inclui um componente do gerenciador de transações que coordena uma transação envolvendo, no máximo, um único recurso durável ou vários recursos voláteis. Como o gerenciador de transações usa apenas chamadas de domínio dentro do aplicativo, ele produz o melhor desempenho. Os desenvolvedores não precisam interagir diretamente com o gerenciador de transações. Em vez disso, uma infraestrutura comum que define interfaces, comportamento comum e classes auxiliares é fornecida pelo System.Transactions namespace.
Quando você deseja fornecer a transação a um objeto em outro domínio de aplicativo (inclusive entre limites de processo e máquina) no mesmo computador, a System.Transactions infraestrutura escalona automaticamente a transação para ser gerenciada pelo Microsoft Distributed Transaction Coordinator (MSDTC). O escalonamento também ocorre se você inscrever outro gerenciador de recursos durável. Quando escalada, a transação permanece gerenciada em seu estado elevado até sua conclusão.
Entre a transação e a System.Transactions transação MSDTC, existe um tipo intermediário de transação que é disponibilizado através do Alistamento Monofásico Promotable (PSPE). O PSPE é outro mecanismo importante para System.Transactions a otimização do desempenho. Ele permite que um recurso durável remoto, localizado em um domínio de aplicativo, processo ou computador diferente, participe de uma System.Transactions transação sem fazer com que ela seja escalada para uma transação MSDTC. Para obter mais informações sobre o PSPE, consulte Recrutando recursos como participantes em uma transação.
Como o escalonamento é iniciado
O escalonamento de transações reduz o desempenho porque o MSDTC reside em um processo separado, e o escalonamento de uma transação para o MSDTC resulta no envio de mensagens através do processo. Para melhorar o desempenho, você deve atrasar ou evitar o escalonamento para MSDTC; Assim, você precisa saber como e quando a escalada é iniciada.
Enquanto a System.Transactions infraestrutura lidar com recursos voláteis e, no máximo, um recurso durável que suporte notificações monofásicas System.Transactions , a transação permanece na propriedade da infraestrutura. O gerenciador de transações se aproveita apenas dos recursos que vivem no mesmo domínio do aplicativo e para os quais o registro em log (gravação do resultado da transação no disco) não é necessário. Um escalonamento que resulta na transferência da propriedade da transação para o System.Transactions MSDTC pela infraestrutura acontece quando:
Pelo menos um recurso durável que não suporta notificações monofásicas é incluído na transação.
Pelo menos dois recursos duráveis que suportam notificações monofásicas são incluídos na transação. Por exemplo, inscrever uma única conexão com o SQL Server 2005 não faz com que uma transação seja promovida. No entanto, sempre que você abre uma segunda conexão com um banco de dados do SQL Server 2005 fazendo com que o banco de dados se aliste, a System.Transactions infraestrutura deteta que ele é o segundo recurso durável na transação e o escalona para uma transação MSDTC.
Uma solicitação para "marechal" a transação para um domínio de aplicativo diferente ou processo diferente é invocada. Por exemplo, a serialização do objeto de transação através de um limite de domínio de aplicativo. O objeto de transação é organizado por valor, o que significa que qualquer tentativa de passá-lo através de um limite de domínio de aplicativo (mesmo no mesmo processo) resulta na serialização do objeto de transação. Você pode passar os objetos de transação fazendo uma chamada em um método remoto que usa um Transaction parâmetro ou pode tentar acessar um componente remoto com serviço transacional. Isso serializa o objeto de transação e resulta em um escalonamento, como quando uma transação é serializada em um domínio de aplicativo. Está a ser distribuído e o gestor de transações local já não é adequado.
A tabela a seguir lista todas as exceções possíveis que podem ser lançadas durante o escalonamento.
Tipo de exceção | Condição |
---|---|
InvalidOperationException | Uma tentativa de escalar uma transação com nível de isolamento igual a Snapshot. |
TransactionAbortedException | O gerenciador de transações está inativo. |
TransactionException | O escalonamento falha e o aplicativo é abortado. |