webentwicklung-frage-antwort-db.com.de

Der Transaktionsmanager hat seine Unterstützung für Remote-/Netzwerktransaktionen deaktiviert

Ich verwende SQL Server und ASP.NET. Ich habe folgende Funktion:

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

Ausnahme: ' Der Transaktionsmanager hat die Unterstützung für RemoteNetzwerk-Transaktionen deaktiviert. -/' ist geworfen.

Beschreibung von JoinScope:

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

Ich habe auf diese Weise in einer anderen Anwendung mit derselben Umgebung ohne Probleme gearbeitet, aber hier habe ich dieses Problem. Was kann ich tun, um das Problem zu beheben?

72
Lajos Arpad

Stellen Sie sicher, dass der "Distributed Transaction Coordinator" -Dienst sowohl auf der Datenbank als auch auf dem Client ausgeführt wird. und "TIP aktivieren".

So aktivieren Sie den Netzwerk-DTC-Zugriff für MS DTC-Transaktionen

  1. Öffnen Sie das Snap-In für Komponentendienste.

    Klicken Sie zum Öffnen der Komponentendienste auf Start. Geben Sie in das Suchfeld dcomcnfg ein, und drücken Sie die EINGABETASTE.

  2. Erweitern Sie die Konsolenstruktur, um den DTC (z. B. Local DTC) zu suchen, für den Sie den Netzwerk-MS-DTC-Zugriff aktivieren möchten.

  3. Klicken Sie im Menü Aktion auf Eigenschaften.

  4. Klicken Sie auf die Registerkarte Sicherheit, und nehmen Sie die folgenden Änderungen vor: .__ Aktivieren Sie in den Sicherheitseinstellungen das Kontrollkästchen DTC-Netzwerkzugriff.

    Aktivieren Sie in der Transaction Manager-Kommunikation die Kontrollkästchen Eingehende zulassen und Ausgehende zulassen.

119
Magnus

Ich bekam dieses Problem zeitweise, ich hatte die Anweisungen hier und sehr ähnliche an anderer Stelle befolgt. Alles wurde richtig konfiguriert.

Diese Seite: http://sysadminwebsite.wordpress.com/2012/05/29/9/ hat mir geholfen, das Problem zu finden.

Grundsätzlich hatte ich doppelte CIDs für den MSDTC auf beiden Servern. HKEY_CLASSES_ROOT\CID

Siehe: http://msdn.Microsoft.com/de-de/library/aa561924.aspx section Stellen Sie sicher, dass MSDTC ein eindeutiger CID-Wert zugewiesen ist.

Ich arbeite mit virtuellen Servern, und unser Serverteam verwendet für jeden Server dasselbe Bild. Es ist eine einfache Lösung und wir mussten keinen Neustart durchführen. Der DTC-Dienst musste jedoch auf Automatisch starten gesetzt werden und nach der Neuinstallation gestartet werden.

10
Tod

Ich hatte eine Store-Prozedur, die eine andere Store-Prozedur in "Linked Server" aufrief. Wenn ich es in ssms ausführte, war es in Ordnung, aber wenn ich es in application (By Entity Framework) aufrufe, erhielt ich diesen Fehler. Dieser Artikel hat geholfen Ich und ich haben dieses Skript verwendet:

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

weitere Informationen finden Sie hier: Verknüpfter Server: Der Partner Transaction Manager hat die Unterstützung für Remote Netzwerk-Transaktionen deaktiviert. - /

4

Kommentar von answer : "Stellen Sie sicher, dass Sie für alle Datenbankaufrufe in der Transaktion dieselbe offene Verbindung verwenden. - Magnus"

Unsere Benutzer werden in einer separaten Datenbank von den Daten gespeichert, mit denen ich in den Transaktionen gearbeitet habe. Das Öffnen der Datenbankverbindung für den Benutzer hat diesen Fehler für mich verursacht. Das Verschieben der anderen Datenbankverbindung und der Benutzersuche außerhalb des Transaktionsbereichs hat den Fehler behoben. 

3
Bakanekobrain

In meinem Szenario wurde die Ausnahme ausgelöst, weil ich versuchte, eine neue Verbindungsinstanz innerhalb eines TransactionScope für eine bereits vorhandene Verbindung zu erstellen:

Beispiel:

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
Daniel Minnaar

Ich poste hier die Lösung, weil ich nach einiger Suche hier gelandet bin, also auch andere. Ich habe versucht, EF 6 zum Aufrufen einer gespeicherten Prozedur zu verwenden, hatte jedoch einen ähnlichen Fehler, da für die gespeicherte Prozedur ein linked server verwendet wurde.

Die Operation konnte nicht ausgeführt werden, da OLE DB-Provider _ für Verbindungsserver _ keine verteilte Transaktion starten konnte.

Der Partner Transaction Manager hat die Unterstützung für Remote-/Netzwerk-Transaktionen deaktiviert. *

Der Sprung zu SQL Client hat mein Problem behoben und für mich auch bestätigt, dass es sich um eine EF-Sache handelt.

EF-modellgenerierter methodischer Versuch:

db.SomeStoredProcedure();

ExecuteSqlCommand-basierter Versuch:

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

Mit:

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

Dieser Code kann verkürzt werden, aber ich denke, dass diese Version für das Debugging und das Durchlaufen etwas bequemer ist.

Ich glaube nicht, dass Sql Client eine bevorzugte Wahl ist, aber ich war der Meinung, dass es zumindest wert ist, geteilt zu werden, wenn jemand, der ähnliche Probleme hat, hier bei Google landet. 

Der obige Code ist C #, aber das Konzept des Versuchs, auf den SQL-Client umzusteigen, gilt weiterhin. Zumindest wird es diagnostisch sein, dies zu versuchen.

1
Greg

Ich hatte die gleiche Fehlermeldung. Ich habe das Problem behoben, indem ich pooling=False in ;pooling=true;Max Pool Size=200 in der Verbindungszeichenfolge geändert habe.

0
Niels Bijl

Falls andere das gleiche Problem haben: 

Ich hatte einen ähnlichen Fehler. Es stellte sich heraus, dass ich mehrere SQL-Anweisungen in Transaktionen umwickelte, von denen eine auf einem Verbindungsserver ausgeführt wurde (Merge-Anweisung in einer EXEC (...) AT Server-Anweisung). Ich habe das Problem gelöst, indem ich eine separate Verbindung zum Verbindungsserver aufbaute, diese Anweisung in einem try-Befehl einkapsle ... catch und dann die Transaktion für die ursprüngliche Verbindung abbrechen, falls der catch ausgelöst wird.

0
aggaton