Nesta última semana, fiz a migração de um servidor SQL Server 2000 para SQL Server 2008 R2. Depois de quase tudo certinho, base verificada, recriados os índices e estatísticas, a equipe de testes chega com a mensagem de erro acima que tinha sido logada dezenas de vezes no log do sistema. E o melhor, “esse erro nunca aconteceu no sistema antes, eu nunca vi esse erro antes”, diziam eles. Pela mensagem de erro, minha primeira pergunta foi: “Vocês utilizam Transação Distribuida?” A resposta veio direta. “Sim!” .

Eu adoro quando acontecem as cansativas reuniões de planejamento, onde tentamos tirar o máximo de informação dos envolvidos no processo, e eles simplesmente esquecem destes “pequenos” detalhes da aplicação!! hehe… Enfim, tínhamos a janela até a meia-noite da quinta-feira e eram por volta de 20h… Ou seja, tínhamos tempo para tentar solucionar o problema antes de tomarmos a decisão mais radical, que era abortar a migração e voltar para o SQL 2000, mas, claro, eu não era nem um pouco favorável à essa estratégia…

Com a informação de que eles utilizam transações distribuidas, minha primeira aposta foi de que o novo servidor não estava com o MSDTC (Microsoft Distributed Transaction Coordinator) rodando. Verificado o serviço estava tudo ok.

Muito bem, fui dar uma pesquisada e encontrei a solução que posto agora aqui. Mas antes, vamos nos situar a respeito do problema.

O que é o MSDTC?

O MSDTC é um serviço do Microsoft Windows responsável por gerenciar transações que atualizam dois ou mais recursos protegidos por uma transação, como o SQL Server, Message Queue e sistema de arquivos. Ele foi incluído a partir do Windows 2000. Especialmente no Windows Server 2003 SP1 houveram algumas mudanças que alteram o comportamento do MSDTC por questões de segurança. As principais modificações são a que dá ao administrador maior controle sobre a comunicação de rede entre computadores e também a que todas as comunicações são desabilitadas por default.

Uma transação quando envolve dois ou mais computadores é chamada de Transação Distribuida, e cada computador que participa de uma transação distribuida utiliza seus próprios recursos para garantir a finalização desta transação.

O MSDTC gerencia todo esse processo, utilizando COM+ e .NET remoting, garantindo que a transação seja comitada em todos os computadores envolvidos na transação ou então que seja feito o ROLLBACK, desta forma, as propriedades ACID serão respeitadas em toda a transação. Para que o MSDTC possa efetuar seu trabalho corretamente, ele utiliza um protocolo chamado Two-phase Commit, onde na fase 1 o transaction manager requisita que todos os computadores envolvidos na transação se preparem para o Commit e na fase 2, se todos os computadores estiverem ok, o transaction manager dispara a mensagem de que o Commit deve ser efetuado em todos os computadores.

Como funciona  o MSDTC a partir do Windows Server 2003 SP1 juntamente com o SQL Server?

Por default, o comportamento do MSDTC a partir do Windows Server 2003 SP1, é de que se houverem transações envolvendo um SQL Server, essas transações deverão falhar. Para que as transações não falhem, é necessário que sejam feitas algumas alterações na configuração do MSDTC.

Ok, eu já tinha as pistas que precisava para solucionar o problema. Agora, mãos à obra para solucioná-lo.

1. Tenha certeza de que o MSDTC está habilitado no firewall do Windows

2. Configure corretamente o MSDTC

– Abra o Serviços de Componente, localizado em Iniciar -> Ferramentas Administrativas -> Serviços de Componente

– Clique na árvore Serviços de Componente -> Computadores -> Meu Computador -> Coordenador de transações distribuidas

– Na janela principal, no ícone DTC Local, clique com o botão direito e clique em Propriedades

– Clique na aba Segurança (Você verá a janela abaixo)

– Marque as opções:

– Acesso DTC de Rede

– Permitir Clientes Remotos

– Permitir Entrada / Permitir Saída (dependendo da sua necessidade)

– Após isso, o MSDTC irá reiniciar, e talvez também seja necessário reiniciar o servidor.

Espero ter ajudado!

Pesquisas adicionais:

http://technet.microsoft.com/pt-br/library/cc759136(WS.10).aspx

Anúncios