Como habilito o MSDTC no SQL Server?

106

Esta é uma pergunta válida? Tenho um aplicativo .NET do Windows que usa MSTDC e está lançando uma exceção:

System.Transactions.TransactionManagerCommunicationException: O acesso à rede para Distributed Transaction Manager (MSDTC) foi desabilitado. Habilite o DTC para acesso à rede na configuração de segurança do MSDTC usando a ferramenta Administrativa dos Serviços de Componentes ---> System.Runtime.InteropServices.COMException (0x8004D024): O gerenciador de transações desativou o suporte para transações remotas / de rede. (Exceção de HRESULT: 0x8004D024) em System.Transactions.Oletx.IDtcProxyShimFactory.ReceiveTransaction (UInt32 propgationTokenSize, Byte [] propgationToken, IntPtr managedIdentifier, Guid & transactionIdentifier, OletxTransactionShimactionLevel & Isolation

Segui o guia Kbalertz para habilitar o MSDTC no PC em que o aplicativo está instalado, mas o erro ainda ocorre.

Eu queria saber se isso era um problema de banco de dados? Se sim, como posso resolver isso?

Dan
fonte
Se as soluções mencionadas não resolverem o problema, verifique este link
Shahab J

Respostas:

127

Use para windows Server 2008 r2 e Windows Server 2012 R2

  1. Clique em Iniciar , Executar , digite dcomcnfg e clique em OK para abrir os Serviços de Componentes .

  2. Na árvore de console, clique para expandir Serviços de componente , clique para expandir Computadores , clique para expandir Meu computador , clique para expandir Coordenador de transações distribuídas e, em seguida, clique em DTC Local .

  3. Clique com o botão direito em DTC Local e clique em Propriedades para exibir a caixa de diálogo Propriedades de DTC Local .

  4. Clique na guia Segurança .

  5. Marque a caixa de seleção "Acesso ao DTC de rede" .

  6. Por fim, marque as caixas de seleção "Permitir entrada" e "Permitir saída" .

  7. Clique em Aplicar , OK .

  8. Uma mensagem aparecerá sobre como reiniciar o serviço.

  9. Clique em OK e pronto.

Referência: https://msdn.microsoft.com/en-us/library/dd327979.aspx

Observação: às vezes, o firewall da rede no computador local ou no servidor pode interromper sua conexão, portanto, certifique-se de criar regras para "Permitir entrada" e "Permitir conexão de saída" paraC:\Windows\System32\msdtc.exe

Shiv Singh
fonte
Funciona para Windows Server 2012 R2 também. Obrigado pelas instruções claras. Nunca teria encontrado isso sozinho!
Jonazu
@jonazu agora também atualizei a resposta para o Windows Server 2012 R2 :)
Shiv Singh
Bom trabalho, ShivSingh!
Super Coder
O caminho correto de msdtc.exeé:c:\windows\system32\msdtc.exe
firepol
1
Parece haver um bug em que essas propriedades não se fixam quando definidas por meio da IU, pelo menos em nós Server 2016 em cluster. A solução é para definir essas propriedades manualmente no registo: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSDTC\Security. Mais informações sobre as propriedades aqui .
Paulo
102

Você ainda precisa do MSDTC? O escalonamento que você está enfrentando geralmente é causado pela criação de várias conexões em um único TransactionScope.

Se você precisar dele, será necessário ativá-lo conforme descrito na mensagem de erro. No XP:

  • Vá para Ferramentas Administrativas -> Serviços de Componentes
  • Expanda Serviços de Componentes -> Computadores ->
  • Clique com o botão direito -> Propriedades -> guia MSDTC
  • Clique no botão Configuração de Segurança
Andrew Peters
fonte
2
Também no firewall do Windows, abri a porta 135 TCP e adicionei c: \ windows \ msdtc.exe como uma exceção
Sameer Alibhai
20
Obrigado pelo comentário sobre o erro causado pela criação de várias conexões em um único TransactionScope. Eu estava recebendo o erro e esse era exatamente o problema. Eu não queria usar o MSDTC, então encontrei a nova conexão errônea e reutilizei uma existente. Obrigado!
Jim McKeeth,
10
Estou no Windows 7 e 8 e há apenas uma seção "Coordenador padrão". Onde posso obter a configuração de segurança de que você está falando?
qdev76
2
1) Clique com o botão direito do mouse em DTC local e escolha as propriedades 2) Abra a guia de segurança 3) Marque pelo menos Acesso ao DTC de rede, Permitir clientes remotos e Permitir entrada.
Rob Sedgwick
19

Descobri que a melhor maneira de depurar é usar a ferramenta Microsoft chamada DTCPing

  1. Copie o arquivo para o servidor (DB) e o cliente (servidor de aplicativos / pc cliente)
    • Inicie no servidor e no cliente
    • No servidor: preencha o nome do computador netbios do cliente e tente configurar uma conexão DTC
    • Reinicie os dois aplicativos.
    • No cliente: preencha o nome do computador netbios do servidor e tente configurar uma conexão DTC

Tive problemas com tarifas em nossa antiga rede da empresa e tenho algumas dicas:

  • se você receber a mensagem de erro "Gethostbyname falhou", significa que o computador não pode encontrar o outro computador pelo nome netbios . O servidor pode, por exemplo, resolver e executar ping no cliente, mas isso funciona no nível DNS. Não em um nível de pesquisa netbios. Usar servidores WINS ou alterar o LMHOST (sujo) resolverá esse problema.
  • se você receber um erro "Acesso negado", as configurações de segurança não coincidem. Você deve comparar a guia de segurança do msdtc e obter o servidor e o cliente correspondentes. Outra coisa a ser observada é o valor RestrictRemoteClients . Dependendo da versão do seu sistema operacional e, mais importante do Service Pack, esse valor pode ser diferente.
  • Outros problemas de conexão:
    • O firewall entre o servidor e o cliente deve permitir a comunicação pela porta 135. E o mais importante, a conexão pode ser iniciada de ambos os sites (eu tive muitos problemas com o pessoal do firewall na minha empresa porque eles presumiram que apenas o servidor abriria uma conexão para essa porta)
    • O protocolo retorna uma porta aleatória para conexão para a comunicação da transação real. O pessoal de firewall não gosta disso, gosta de restringir as portas a um determinado intervalo. Você pode restringir a geração de porta dinâmica RPC a um determinado intervalo usando as chaves descritas em Como configurar a alocação de porta dinâmica RPC para trabalhar com firewalls .

Na minha experiência, se o DTCPing é capaz de configurar uma conexão DTC iniciada no cliente e iniciada no servidor, suas transações não são mais o problema.

Davy Landman
fonte
6

Também pode ver aqui como ativar o MSDTC em services.msc do Painel de Controle.

No servidor em que reside o disparador, é necessário ativar o serviço MSDTC. Você pode fazer isso clicando em INICIAR> CONFIGURAÇÕES> PAINEL DE CONTROLE> FERRAMENTAS ADMINISTRATIVAS> SERVIÇOS. Encontre o serviço chamado 'Coordenador de transações distribuídas' e CLIQUE COM O DIREITO (nele e selecione)> Iniciar.

Cameron Castillo
fonte
4

O MSDTC deve estar habilitado em ambos os sistemas, servidor e cliente.
Além disso, certifique-se de que não haja um firewall entre os sistemas que bloqueie o RPC.
DTCTest é um pequeno aplicativo legal que ajuda você a solucionar quaisquer outros problemas.

Lars Mæhlum
fonte
Acho que este é o novo local microsoft.com/en-us/download/details.aspx?id=30746
Air2
4

@Dan,

Não preciso do msdtc ativado para que as transações funcionem?

Apenas transações distribuídas - aquelas que envolvem mais de uma única conexão. Certifique-se duplamente de abrir apenas uma única conexão dentro da transação e ela não aumentará - o desempenho também será muito melhor.

Andrew Peters
fonte
Não preciso do msdtc ativado para que as transações funcionem? De qualquer maneira, várias conexões não estão sendo feitas, tanto quanto eu sei. Já executei essas etapas no PC cliente. Você está dizendo que também devo executar essas etapas no servidor de banco de dados?
Dan
@Dan, você não é obrigado a habilitar o DTC se estiver usando transações ado.net. É necessário habilitar o MSDTC no servidor apenas se estiver usando transações distribuídas
Niraj