O gerenciador de transações desativou seu suporte para transações remotas / de rede

86

Estou usando SQL Server e ASP.NET. Tenho a seguinte função:

Using js = daoFactory.CreateJoinScope()
    Using tran = New Transactions.TransactionScope()
        '...
        tran.Complete()
    End Using
End Using

No entanto, a exceção ' O gerenciador de transações desativou seu suporte para transações remotas / de rede. 'é lançado.

Descrição do JoinScope:

Public Class JoinScope
    Implements IJoinScope
    Implements IDisposable
    '...
End Class

Já trabalhei dessa forma em outro aplicativo com o mesmo ambiente sem problemas, mas aqui estou com esse problema. O que posso fazer para corrigir o problema?

Lajos Arpad
fonte
Eu segui as etapas que Magnus sugeriu primeiro para ter certeza de que tinha todas as bases cobertas, por assim dizer, e então consegui um erro sugerindo que eu habilitei clr no SQL Server, e funcionou para mim. msdn.microsoft.com/en-us/library/ms131048.aspx
Lee

Respostas:

141

Certifique-se de que o serviço "Coordenador de transações distribuídas" esteja sendo executado no banco de dados e no cliente. Além disso, certifique-se de marcar "Acesso ao DTC de rede", "Permitir cliente remoto", "Permitir entrada / saída" e "Ativar TIP".

Para habilitar o acesso à rede DTC para transações MS DTC

  1. Abra o snap-in Serviços de componentes.

    Para abrir os Serviços de Componentes, clique em Iniciar. Na caixa de pesquisa, digite dcomcnfg e pressione ENTER.

  2. Expanda a árvore do console para localizar o DTC (por exemplo, DTC Local) para o qual deseja habilitar o Acesso à Rede MS DTC.

  3. No menu Ação, clique em Propriedades.

  4. Clique na guia Segurança e faça as seguintes alterações: Em Configurações de segurança, marque a caixa de seleção Acesso ao DTC de rede.

    Em Comunicação do Gerenciador de transações, marque as caixas de seleção Permitir entrada e Permitir saída.

Magnus
fonte
3
Obrigado, Magnus. Deve ser uma configuração do aplicativo, pois esse tipo de transação funcionava com os mesmos computadores, o que significa que esse problema não é relacionado à máquina.
Lajos Arpad
Sim eu fiz. Ele lança a mesma exceção.
Lajos Arpad
Acho que tem a ver com o que você está realmente fazendo dentro do TransactionScope.
Magnus
Além disso, preciso do escopo de junção, porque desejo que essa transação seja enviada como uma única solicitação ao servidor de banco de dados.
Lajos Arpad
13
certifique-se de usar a mesma conexão aberta para todas as chamadas de banco de dados dentro da transação.
Magnus
11

Eu estava tendo esse problema de forma intermitente, segui as instruções aqui e outras muito semelhantes em outros lugares. Tudo foi configurado corretamente.

Esta página: http://sysadminwebsite.wordpress.com/2012/05/29/9/ me ajudou a encontrar o problema.

Basicamente, eu tinha CIDs duplicados para o MSDTC em ambos os servidores. HKEY_CLASSES_ROOT \ CID

Consulte: http://msdn.microsoft.com/en-us/library/aa561924.aspx seção Verifique se o MSDTC recebeu um valor CID exclusivo

Estou trabalhando com servidores virtuais e nossa equipe de servidores gosta de usar a mesma imagem para todos os servidores. É uma solução simples e não precisamos reiniciar. Mas o serviço DTC precisava ser configurado para inicialização automática e precisava ser iniciado após a reinstalação.

Tod
fonte
9

Eu tinha um procedimento de armazenamento que chamava outro procedimento de armazenamento em "servidor vinculado". Quando eu o executo no ssms estava tudo bem, mas quando eu o chamo no aplicativo (By Entity Framework), recebo este erro. Este artigo me ajudou e usei este script:

EXEC sp_serveroption @server = 'LinkedServer IP or Name',@optname = 'remote proc transaction promotion', @optvalue = 'false' ;

para mais detalhes veja isto: Servidor vinculado: O gerenciador de transações do parceiro desativou seu suporte para transações remotas / de rede

Amirhossein Yari
fonte
1
Um link para uma solução é bem-vindo, mas certifique-se de que sua resposta seja útil sem ele: adicione contexto ao link para que seus outros usuários tenham uma ideia do que ele é e por que está lá, depois cite a parte mais relevante da página que você ' novo link para caso a página de destino não esteja disponível. Respostas que são pouco mais do que um link podem ser excluídas.
Petter Friberg
1
Isso resolveu meu problema, então, obrigado por fornecer isso. Não sei por que teve um voto -1, já que funcionou para retificar meu problema específico.
Boyd P
6

No meu cenário, a exceção estava sendo lançada porque eu estava tentando criar uma nova instância de conexão dentro de um TransactionScope em uma conexão já existente:

Exemplo:

void someFunction()
{
    using (var db = new DBContext(GetConnectionString()))
    {
        using (var transaction = new TransactionScope(TransactionScopeOption.Required, new TransactionOptions { IsolationLevel = System.Transactions.IsolationLevel.ReadUncommitted }))
        {
            someOtherFunction(); // This function opens a new connection within this transaction, causing the exception.
        }
    }
}

void someOtherFunction()
{
    using (var db = new DBContext(GetConnectionString()))
    {
        db.Whatever // <- Exception.
    }
}
Daniel Minnaar
fonte
3

Comentário da resposta : "certifique-se de usar a mesma conexão aberta para todas as chamadas de banco de dados dentro da transação. - Magnus"

Nossos usuários são armazenados em um banco de dados separado dos dados com os quais eu estava trabalhando nas transações. Abrir a conexão do banco de dados para obter o usuário estava causando esse erro para mim. Mover a outra conexão db e a consulta do usuário para fora do escopo da transação corrigiu o erro.

Bakanekobrain
fonte
1

Eu posto a solução abaixo aqui porque depois de algumas buscas foi onde eu parei, então outros podem também. Eu estava tentando usar o EF 6 para chamar um procedimento armazenado, mas tive um erro semelhante porque o procedimento armazenado tinha um servidor vinculado sendo utilizado.

A operação não pôde ser realizada porque o provedor OLE DB _ para o servidor vinculado _ não conseguiu iniciar uma transação distribuída

O gerenciador de transações do parceiro desativou o suporte para transações remotas / de rede *

Pular para o SQL Client corrigiu meu problema, o que também confirmou para mim que era uma coisa EF.

Tentativa baseada no método gerado pelo modelo EF:

db.SomeStoredProcedure();

Tentativa baseada em ExecuteSqlCommand:

db.Database.ExecuteSqlCommand("exec [SomeDB].[dbo].[SomeStoredProcedure]");

Com:

var connectionString = db.Database.Connection.ConnectionString;
var connection = new System.Data.SqlClient.SqlConnection(connectionString);    
var cmd = connection.CreateCommand();
cmd.CommandText = "exec [SomeDB].[dbo].[SomeStoredProcedure]";

connection.Open();
var result = cmd.ExecuteNonQuery();

Esse código pode ser reduzido, mas acho que essa versão é um pouco mais conveniente para depurar e avançar.

Não acredito que o Sql Client seja necessariamente a escolha preferida, mas achei que pelo menos vale a pena compartilhar se alguém mais com problemas semelhantes for encontrado aqui pelo Google.

O código acima é C #, mas o conceito de tentar alternar para o cliente Sql ainda se aplica. No mínimo, será um diagnóstico tentar fazer isso.

Greg
fonte
Interessante. Acho que você pode querer editar a solução com o código VB (existem tradutores de código disponíveis), para que corresponda às tags da questão. No entanto, eu votei positivamente.
Lajos Arpad
1

Se você não conseguiu encontrar o DTC local nos serviços de componente, tente executar este script do PowerShell primeiro:

$DTCSettings = @(
"NetworkDtcAccess",               # Network DTC Access
"NetworkDtcAccessClients",        # Allow Remote Clients        ( Client and Administration)
"NetworkDtcAccessAdmin",          # Allow Remote Administration ( Client and Administration)
"NetworkDtcAccessTransactions",   #                (Transaction Manager Communication )
"NetworkDtcAccessInbound",        # Allow Inbound  (Transaction Manager Communication )
"NetworkDtcAccessOutbound" ,      # Allow Outbound (Transaction Manager Communication )
"XaTransactions",                 # Enable XA Transactions
"LuTransactions"                  # Enable SNA LU 6.2 Transactions
)
foreach($setting in $DTCSettings)
{
Set-ItemProperty -Path HKLM:\Software\Microsoft\MSDTC\Security -Name $setting -Value 1
} 
Restart-Service msdtc

E parece!

Fonte: O gerenciador de transações do parceiro desativou seu suporte para transações remotas / de rede

Arthur Cam
fonte
0

Caso outros tenham o mesmo problema:

Eu tive um erro semelhante acontecendo. Acontece que eu estava agrupando várias instruções SQL em uma transação, onde uma delas era executada em um servidor vinculado (instrução Merge em uma instrução EXEC (...) AT Server). Resolvi o problema abrindo uma conexão separada com o servidor vinculado, encapsulando essa instrução em um try ... catch e, em seguida, abortar a transação na conexão original, caso o catch seja acionado.

aggaton
fonte
0

Eu tive a mesma mensagem de erro. Para mim, mudar pooling=Falsepara ;pooling=true;Max Pool Size=200na string de conexão corrigiu o problema.

Niels Bijl
fonte
0

Eu estava tendo esse problema com um servidor vinculado no SSMS ao tentar criar um procedimento armazenado.

No servidor vinculado, alterei a opção do servidor "Habilitar promoção em transações distribuídas" para False.

Captura de tela das opções do servidor

Zack Soderquist
fonte