Il gestore delle transazioni ha disabilitato il supporto per le transazioni remote / di rete


86

Sto usando SQL Server e ASP.NET. Ho la seguente funzione:

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

Tuttavia, l'eccezione " Il gestore delle transazioni ha disabilitato il supporto per le transazioni remote / di rete. 'viene lanciato.

Descrizione di JoinScope:

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

Ho lavorato in questo modo in un'altra applicazione con lo stesso ambiente senza problemi, ma qui ho questo problema. Cosa posso fare per risolvere il problema?


Ho eseguito i passaggi suggeriti da Magnus prima per assicurarmi di avere tutte le basi coperte, per così dire, e poi sono riuscito a ottenere un errore che suggerisce che il set abilito clr in SQL Server e che ha funzionato per me. msdn.microsoft.com/en-us/library/ms131048.aspx
Lee

Risposte:


141

Assicurati che il servizio "Distributed Transaction Coordinator" sia in esecuzione sul database e sul client. Assicurati inoltre di selezionare "Accesso DTC di rete", "Consenti client remoto", "Consenti ingresso / uscita" e "Abilita TIP".

Per abilitare l'accesso DTC alla rete per le transazioni MS DTC

  1. Apri lo snap-in Servizi componenti.

    Per aprire Servizi componenti, fare clic su Start. Nella casella di ricerca digitare dcomcnfg e quindi premere INVIO.

  2. Espandere la struttura della console per individuare il DTC (ad esempio, DTC locale) per il quale si desidera abilitare l'accesso di rete MS DTC.

  3. Nel menu Azione, fare clic su Proprietà.

  4. Fare clic sulla scheda Protezione e apportare le seguenti modifiche: In Impostazioni protezione, selezionare la casella di controllo Accesso DTC di rete.

    In Transaction Manager Communication, selezionare le caselle di controllo Consenti in entrata e Consenti in uscita.


3
Grazie, Magnus. Deve essere un'impostazione dell'applicazione, perché questo tipo di transazione ha funzionato con gli stessi computer, il che significa che questo problema non è correlato alla macchina.
Lajos Arpad

Si l'ho fatto. Genera la stessa eccezione.
Lajos Arpad

Immagino che abbia a che fare con ciò che stai effettivamente facendo all'interno di TransactionScope.
Magnus

Inoltre, ho bisogno dell'ambito di join, perché voglio che questa transazione venga inviata come una singola richiesta al server di database.
Lajos Arpad

13
assicurati di utilizzare la stessa connessione aperta per tutte le chiamate al database all'interno della transazione.
Magnus

11

Ricevevo questo problema a intermittenza, avevo seguito le istruzioni qui e altre molto simili altrove. Tutto è stato configurato correttamente.

Questa pagina: http://sysadminwebsite.wordpress.com/2012/05/29/9/ mi ha aiutato a trovare il problema.

Fondamentalmente avevo CID duplicati per MSDTC su entrambi i server. HKEY_CLASSES_ROOT \ CID

Vedere: http://msdn.microsoft.com/en-us/library/aa561924.aspx sezione Assicurarsi che a MSDTC sia assegnato un valore CID univoco

Sto lavorando con server virtuali e al nostro team di server piace usare la stessa immagine per ogni server. È una soluzione semplice e non abbiamo bisogno di un riavvio. Ma il servizio DTC aveva bisogno di essere impostato su Avvio automatico e doveva essere avviato dopo la reinstallazione.


9

Avevo una procedura di archivio che chiama un'altra procedura di archivio in "server collegato". Quando la eseguo in ssms era ok, ma quando la chiamo nell'applicazione (da Entity Framework), ho ricevuto questo errore. Questo articolo mi ha aiutato e ho usato questo script:

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

per maggiori dettagli guarda questo: Server collegato: il gestore delle transazioni partner ha disabilitato il suo supporto per le transazioni remote / di rete


1
Un collegamento a una soluzione è il benvenuto, ma assicurati che la tua risposta sia utile senza di essa: aggiungi un contesto attorno al collegamento in modo che i tuoi colleghi utenti abbiano un'idea di cosa sia e perché sia ​​lì, quindi cita la parte più pertinente della pagina che tu " re collegamento a nel caso in cui la pagina di destinazione non è disponibile. Le risposte che sono poco più di un collegamento possono essere eliminate.
Petter Friberg

1
Questo ha risolto il mio problema, quindi grazie per averlo fornito. Non so perché ha ottenuto un voto -1, dal momento che ha funzionato per correggere il mio problema specifico.
Boyd P

6

Nel mio scenario, l'eccezione è stata generata perché stavo cercando di creare una nuova istanza di connessione all'interno di un TransactionScope su una connessione già esistente:

Esempio:

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.
    }
}

3

Commento dalla risposta : "assicurati di utilizzare la stessa connessione aperta per tutte le chiamate al database all'interno della transazione. - Magnus"

I nostri utenti sono memorizzati in un db separato dai dati con cui stavo lavorando nelle transazioni. L'apertura della connessione db per ottenere l'utente stava causando questo errore per me. Lo spostamento dell'altra connessione db e della ricerca utente al di fuori dell'ambito della transazione ha risolto l'errore.


1

Inserisco la soluzione di seguito qui perché dopo alcune ricerche è qui che sono atterrato, quindi anche altri potrebbero. Stavo cercando di utilizzare EF 6 per chiamare una stored procedure, ma si è verificato un errore simile perché la stored procedure aveva un server collegato in uso.

Impossibile eseguire l'operazione perché il provider OLE DB _ per il server collegato _ non è stato in grado di avviare una transazione distribuita

Il gestore delle transazioni partner ha disabilitato il supporto per le transazioni remote / di rete *

Il passaggio a SQL Client ha risolto il mio problema, il che mi ha anche confermato che si trattava di una cosa EF.

Tentativo basato sul metodo generato dal modello EF:

db.SomeStoredProcedure();

Tentativo basato su ExecuteSqlCommand:

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

Con:

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();

Quel codice può essere abbreviato, ma penso che quella versione sia leggermente più conveniente per il debug e il passaggio.

Non credo che Sql Client sia necessariamente una scelta preferita, ma ho ritenuto che valesse la pena condividerlo se qualcun altro con problemi simili viene atterrato qui da Google.

Il codice sopra è C #, ma il concetto di provare a passare a Sql Client è ancora valido. Per lo meno sarà diagnostico tentare di farlo.


Interessante. Penso che potresti voler modificare la soluzione con codice VB (sono disponibili traduttori di codice), in modo che corrisponda ai tag della domanda. Tuttavia, l'ho votato comunque.
Lajos Arpad

1

Ho riscontrato questo problema con un server collegato in SSMS durante il tentativo di creare una stored procedure.

Sul server collegato, ho modificato l'opzione del server "Abilita promozione su transazione distribuita" su False.

Screenshot delle opzioni del server


1

Se non riesci a trovare DTC locale nei servizi del componente, prova prima a eseguire questo script di PowerShell:

$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 sembra!

Origine: il gestore delle transazioni partner ha disabilitato il supporto per le transazioni remote / di rete


0

Nel caso in cui altri abbiano lo stesso problema:

Ho riscontrato un errore simile. si è scoperto che stavo avvolgendo diverse istruzioni SQL in una transazione, dove una di esse è stata eseguita su un server collegato (istruzione Merge in un'istruzione EXEC (...) AT Server). Ho risolto il problema aprendo una connessione separata al server collegato, incapsulando tale istruzione in un tentativo ... cattura quindi interrompi la transazione sulla connessione originale nel caso in cui il fermo venga attivato.


0

Ho ricevuto lo stesso messaggio di errore. Per me il passaggio pooling=Falsea ;pooling=true;Max Pool Size=200nella stringa di connessione ha risolto il problema.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.