Que tipo de transação usar?

Esta semana recebi um questionamento de quando usar que tipo de transação no .Net Framework. Como creio que a resposta é genérica e pode ajudar outros arquitetos, aqui vai a minha resposta para todos:

“Caro X,

Infelizmente não consigo me lembrar de um documento consolidando os tipos de transações e quando usá-las, mas me diga se a explicação abaixo ajuda:

                - Light Transaction (LT) do .Net: é como se fosse um DTC re-escrito pra .Net (coordenador do two-phase commit) e coordena transações dentro de um mesmo Application Domain. Assim, se você usar o .Net para abrir bancos diferentes (com o ADO.Net) ou incorporar messages queues (com o System.Messaging ou WCF) em uma mesma transação, este é o coordenador de transação a ser utilizado. Ele adiciona uma latência na ordem de poucos milissegundos;

                - DTC: continua existindo. Sempre que um Light Transaction recebe um pedido para falar com um objeto COM+ ele passa o controle da transação para o DTC (o mesmo usado pelo COM+), por tratar de transações em contextos diferentes (processos diferentes). Lembrando sempre que, transações em uma mesma máquina têm custo muito menor do que em máquinas diferentes. O tempo típico de latência p/ coordenação em uma mesma máquina é da ordem de dezenas a uma centena de milissegundos;

                - WCF: o WCF pode utilizar o WS- Transaction para coordenar uma transação entre máquinas. Exemplo: cliente abre no WCF um contexto de transação chamando dois métodos de servidores remotos. O WS-Transaction pede a ajuda de um coordenador externo para garantir um two-phase commit. O coordenador, no caso da Microsoft, é o próprio DTC remoto utilizando o protocolo WS-Transaction. Como o WS-Transaction é um protocolo padrão, coordenadores de outros fabricantes podem ser utilizados. Este método é o que tem pior desempenho e é análogo ao uso de um DTC remoto. Isto acontece porque quanto maior o custo de conversação com o coordenador maior é a latência e o impacto no tempo de locking dos recursos usados na transação. O tempo típico de latência p/ coordenação é de centenas de milissegundos (pode variar muito, dependendo da rede, do desempenho da máquina do dtc e da velocidade do disco para o log da transação);

                - Long running transactions (LRT) : usado pelo Biztalk ou pelo Workflow Foundation, este método não usa um coordenador de transação, mas utiliza sim um método de desfazimento. Com isto, transações que levam de minutos a semanas não fazem lock em nenhum recurso. Caso uma falha aconteça no processo, um processo (workflow) de desfazimento entra em ação. O exemplo típico seria o agendamento de uma viagem com posterior cancelamento no caso de não conseguirmos hotel (cancelamento = procedimento de desfazimento);

Quando projeto um aplicativo tento ao máximo utilizar os dois primeiros mecanismos e sempre na mesma máquina. Evito ao máximo a coordenação entre máquinas diferentes como acontece no caso do WCF ou DTC remoto. Faço isto não por problemas do WCF/DTC, mas porque prefiro, sempre que possível, criar um terceiro serviço que usa o LT ou DTC localmente para coordenar duas chamadas internas (do .Net ou do COM+) – garanto assim o bom desempenho com a composição de métodos. Se quiserem utilizar um coordenador externo será importante garantir que o tempo total (dos serviços chamados + overhead do DTC) não seja muito grande, causando eventual time-out devido ao tempo total de locking na transação. Tenho um artigo que já falava sobre este problema com o uso do DTC remoto (ver https://www.microsoft.com/brasil/msdn/Tecnologias/arquitetura/EnterpriseServices.mspx). Creio que isto continua valendo tanto para o uso do DTC remoto quanto do uso do WS-Transaction.

No caso da SOA, tento sempre que possível usar LRT, uma vez que, na teoria da SOA, devemos pensar os serviços como autônomos. Isto me obriga a usar workflows, message queues e desfazimento. Perco em complexidade mas ganho a total autonomia dos serviços.

                Em tempo: uma boa leitura também seria https://msdn.microsoft.com/en-us/library/ms998530.aspx . As boas práticas contidas no capítulo https://msdn.microsoft.com/en-us/library/ms998556.aspx continuam valendo seja para DTC ou no uso do WS-Transaction. “

Abraços