MSDTC em ambientes virtualizados: veja o CID!

Mais artigos de blogs do que deveriam haver foram dedicados ao MSDTC (Microsoft Distributed Transaction Coordinator): um componente do Windows fantástico, que por baixo dos panos faz com que 2PC (Two Phase Commit) funcione como algo transparente mesmo que as partes sejam tão díspares quanto Bancos de Dados Sql Server, Oracle, MSMQ , o sistema de arquivos etc.

Sem ele toda transação envolvendo partes dispáres teria de ser implementada através de ações de compensação, algo tedioso, complicado e sujeito a erros.

O problema é que nem sempre o MSDTC funciona, na verdade, quando não funciona ele não funciona em nível muito básico: ou as partes simplesmente nem percebem a existência uma da outra, ou toda transação recebe um rollback com alguma mensagem obscura.

A maior parte dos problemas dá-se quando as máquinas não se enxergam pelo nome netbios (o nome curto, intranet), quando há um firewall entre as máquinas, ou quando exige-se mais autenticação entre as máquinas do que a rede pode oferecer. Tudo isso é sabido e compartilhado em artigos mais extensos do que este.

Mas o que ainda não tinhamos visto eram duas maquinas se recusarem a comitar transações por terem o mesmo CID. Explico duas máquinas saudáveis, na mesma rede, se enxergando, com firewall desabilitado se recusavam a comitar transações. Após investigarmos um monte de possibilidades achamos uma: as máquinas tinham a mesma origem, ou seja, eram duas máquinas virtuais criadas a partir de um “template” VMware usado no ambiente de nosso cliente. Embora sob todos os demais aspéctos elas não fossem mais a mesma máquina, apesar da mesma origem, uma marca ficou: O CID. Investicando em HKEY_CLASSES_ROOT\CID em ambas descobrimos que eram todos iguais. A correção? Reinstalar o MSDTC. Como? Acompanhe abaixo.

Abra um prompt elevado de comando, e digite “msdtc –uninstall”, execute (não se assuste com a falta de feedback do comando), e em seguida execute “msdtc –install”, simples assim. Pelo log de aplicações você pode checar a execução do dos comandos, ou basta conferir os valores CID no registro.

Problema resolvido, cliente satisfeito. Dificil foi achar o artigo que recomendasse investigar o CID.

Share