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

86

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

Die Ausnahme ' Der Transaktionsmanager hat die Unterstützung für Remote- / Netzwerktransaktionen 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?

Lajos Arpad
quelle
Ich habe die von Magnus vorgeschlagenen Schritte ausgeführt, um sicherzustellen, dass ich sozusagen alle Grundlagen abgedeckt habe, und dann einen Fehler erhalten, der darauf hinweist, dass ich clr in SQL Server aktiviert habe, und das hat bei mir funktioniert. msdn.microsoft.com/en-us/library/ms131048.aspx
Lee

Antworten:

140

Stellen Sie sicher, dass der Dienst "Distributed Transaction Coordinator" sowohl auf der Datenbank als auch auf dem Client ausgeführt wird. Stellen Sie außerdem sicher, dass Sie "Netzwerk-DTC-Zugriff", "Remote-Client zulassen", "Eingehende / ausgehende zulassen" und "TIP aktivieren" aktivieren.

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

  1. Öffnen Sie das Snap-In "Komponentendienste".

    Klicken Sie zum Öffnen von Komponentendiensten auf Start. Geben Sie im Suchfeld dcomcnfg ein und drücken Sie die EINGABETASTE.

  2. Erweitern Sie die Konsolenstruktur, um den DTC (z. B. Lokaler 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 Netzwerk-DTC-Zugriff.

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

Magnus
quelle
3
Danke, Magnus. Dies muss eine Einstellung der Anwendung sein, da diese Art von Transaktion mit denselben Computern funktioniert hat. Dies bedeutet, dass dieses Problem nicht maschinenbezogen ist.
Lajos Arpad
Ja, habe ich. Es wird die gleiche Ausnahme ausgelöst.
Lajos Arpad
Ich denke, es hat damit zu tun, was Sie tatsächlich im TransactionScope tun.
Magnus
Außerdem benötige ich den Join-Bereich, da diese Transaktion als einzelne Anforderung an den Datenbankserver gesendet werden soll.
Lajos Arpad
13
Stellen Sie sicher, dass Sie für alle Datenbankaufrufe innerhalb der Transaktion dieselbe offene Verbindung verwenden.
Magnus
11

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/en-us/library/aa561924.aspx Abschnitt Stellen Sie sicher, dass MSDTC ein eindeutiger CID-Wert zugewiesen ist

Ich arbeite mit virtuellen Servern und unser Serverteam verwendet gerne für jeden Server das gleiche Image. Es ist eine einfache Lösung und wir brauchten keinen Neustart. Der DTC-Dienst musste jedoch auf Automatisch gestartet und nach der Neuinstallation gestartet werden.

Tod
quelle
8

Ich hatte eine Speicherprozedur, die eine andere Speicherprozedur in "Verbindungsserver" aufruft. Wenn ich sie in ssms ausführe, war sie in Ordnung, aber wenn ich sie in einer Anwendung (By Entity Framework) aufrufe, wird dieser Fehler angezeigt. Dieser Artikel hat mir geholfen und ich habe dieses Skript verwendet:

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

Weitere Informationen finden Sie hier: Verbindungsserver: Der Partner-Transaktionsmanager hat die Unterstützung für Remote- / Netzwerktransaktionen deaktiviert

Amirhossein Yari
quelle
1
Ein Link zu einer Lösung ist willkommen, aber stellen Sie sicher, dass Ihre Antwort ohne sie nützlich ist: Fügen Sie dem Link einen Kontext hinzu, damit Ihre Mitbenutzer eine Vorstellung davon haben, was es ist und warum es dort ist, und zitieren Sie dann den relevantesten Teil der Seite, die Sie verwenden. erneutes Verknüpfen mit, falls die Zielseite nicht verfügbar ist. Antworten, die kaum mehr als ein Link sind, können gelöscht werden.
Petter Friberg
1
Dies hat mein Problem behoben. Vielen Dank, dass Sie dies bereitgestellt haben. Ich weiß nicht, warum es eine -1-Stimme bekommen hat, da es mein spezifisches Problem behoben hat.
Boyd P
6

In meinem Szenario wurde die Ausnahme ausgelöst, weil ich versucht habe, eine neue Verbindungsinstanz in einem 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.
    }
}
Daniel Minnaar
quelle
3

Kommentar aus der Antwort : "Stellen Sie sicher, dass Sie für alle Datenbankaufrufe innerhalb der Transaktion dieselbe offene Verbindung verwenden. - Magnus"

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

Bakanekobrain
quelle
1

Ich poste die folgende Lösung hier, weil ich nach einigem Suchen hier gelandet bin, also vielleicht auch andere. Ich habe versucht, mit EF 6 eine gespeicherte Prozedur aufzurufen, hatte jedoch einen ähnlichen Fehler, da für die gespeicherte Prozedur ein Verbindungsserver verwendet wurde.

Der Vorgang konnte nicht ausgeführt werden, da der OLE DB-Anbieter _ für den Verbindungsserver _ eine verteilte Transaktion nicht starten konnte

Der Partner-Transaktionsmanager hat die Unterstützung für Remote- / Netzwerktransaktionen deaktiviert *

Das Wechseln zu SQL Client hat mein Problem behoben, was mir auch bestätigte, dass es sich um eine EF-Sache handelt.

Vom EF-Modell generierter methodenbasierter 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 gekürzt werden, aber ich denke, dass die Version etwas bequemer zum Debuggen und Durchgehen ist.

Ich glaube nicht, dass SQL Client unbedingt eine bevorzugte Wahl ist, aber ich fand, dass es sich zumindest lohnt, dies zu teilen, wenn jemand, der ähnliche Probleme hat, hier von Google gelandet wird.

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

Greg
quelle
Interessant. Ich denke, Sie möchten die Lösung möglicherweise mit VB-Code bearbeiten (es sind Codeübersetzer verfügbar), damit sie mit den Tags der Frage übereinstimmt. Ich habe es trotzdem positiv bewertet.
Lajos Arpad
1

Wenn Sie in den Komponentendiensten keinen lokalen DTC finden konnten, versuchen Sie zunächst, dieses PowerShell-Skript auszuführen:

$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

Und es scheint!

Quelle: Der Partner-Transaktionsmanager hat die Unterstützung für Remote- / Netzwerktransaktionen deaktiviert

Arthur Cam
quelle
0

Falls andere das gleiche Problem haben:

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

Aggaton
quelle
0

Ich hatte die gleiche Fehlermeldung. Für mich ändert pooling=Falsezu ;pooling=true;Max Pool Size=200in der Verbindungszeichenfolge das Problem behoben.

Niels Bijl
quelle
0

Ich hatte dieses Problem mit einem Verbindungsserver in SSMS, als ich versuchte, eine gespeicherte Prozedur zu erstellen.

Auf dem Verbindungsserver habe ich die Serveroption "Promotion bei verteilten Transaktionen aktivieren" in "Falsch" geändert.

Screenshot der Serveroptionen

Zack Soderquist
quelle