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?
asp.net
vb.net
transactionscope
Lajos Arpad
fonte
fonte
Respostas:
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
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.
Expanda a árvore do console para localizar o DTC (por exemplo, DTC Local) para o qual deseja habilitar o Acesso à Rede MS DTC.
No menu Ação, clique em Propriedades.
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.
fonte
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.
fonte
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
fonte
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. } }
fonte
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.
fonte
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:
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.
fonte
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
fonte
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.
fonte
Eu tive a mesma mensagem de erro. Para mim, mudar
pooling=False
para;pooling=true;Max Pool Size=200
na string de conexão corrigiu o problema.fonte
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
fonte