Frage

in unserem aktuellen Projekt, das wir für die Anwendung als Datenschicht ADO.NET Entity Framework verwenden. Es gibt einige Aufgaben, die in einer Transaktion ausgeführt erfordern, weil es eine Menge Arbeit ist in der Datenbank zu tun. Ich bin mit einer Transaction diese Aufgaben zu umgeben.

using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
    // Do something...
    transactionScope.Complete();
}

Das Problem ist, sobald ich eine Transaction eine Ausnahme auftritt:

  

System.Data.EntityException: Der zugrunde liegende Anbieter schlug fehl auf Öffnen. ---> System.Transactions.TransactionManagerCommunicationException: Die Kommunikation mit dem zugrundeliegenden Transaktionsmanager ist fehlgeschlagen. ---> System.Runtime.InteropServices.COMException (0x80004005):. Fehler HRESULT E_FAIL wurde von einem Aufruf an eine COM-Komponente zurückgegeben

Es scheint, dass diese Fehler etwas mit der MSDTC (Microsoft Distributed Transaction Coordinator). Wenn ich die Sicherheitskonfiguration von MSDTC ändern wird eine andere Ausnahme ausgelöst:

  

System.Data.EntityException: Der zugrunde liegende Anbieter schlug fehl auf Öffnen. ---> System.Transactions.TransactionManagerCommunicationException: Netzzugang für Distributed Transaction Manager (MSDTC) deaktiviert wurde. Bitte aktivieren Sie DTC für den Netzzugang in der Sicherheitskonfiguration für MSDTC das Component Services Administrative Tool.

Allerdings MSDTC ist so konfiguriert, das Transaction wird einen Fehler verursachen. Hat jemand wissen, was falsch ist hier los?

War es hilfreich?

Lösung 8

Hmm, scheint es zu funktionieren, wenn ich die Transactionscope "Unterdrückt":

using (TransactionScope transactionScope = new TransactionScope(TransactionScopeOption.Suppress))
{
    ...
}

Hat jeder wissen, warum?

Andere Tipps

In der Standardeinstellung hat MSDTC Netzwerkzugriff deaktiviert. Um es zu bekommen arbeiten, sollten Sie gehen auf

  

Systemsteuerung-> Verwaltung-   Extras-> Component Services-> Component   Serivces-> Computes-> Arbeitsplatz-> Rechts   Klick-> Einstellungen-> MSDTC-> Sicherheit   Konfiguration

und Check folgenden Kontrollkästchen DTC-Netzwerkzugriff, Eingehende zulassen, Ausgehende zulassen. Authentification sollte nach Ihnen Umgebung gewählt werden. Vielleicht haben Sie auch unter einen Blick nehmen wollen DTCPing Werkzeug verteilte Transaktionen zu debuggen. Um eine Verknüpfung zu geben - Sie müssen Sie Registrierung ändern:

  

HKLM \ Software \ Policies \ Microsoft \ Windows   NT \ RPCRestrictRemoteClients = 0   HKLM \ Software \ Policies \ Microsoft \ Windows NT \ RPCEnableAuthEpResolution = 1

alles bis erhalten und ausgeführt wird.

Ja, es funktioniert Unterdrückt verwenden, weil Sie es erzählen die Ambient-Transaktion zu unterdrücken oder zu ignorieren und eine neue lokale Transaktion erstellen. Da die Transaktion lokal ist, ist es nicht eine verteilte Transaktion so dass sie nicht MSDTC verwenden, aber Sie sollten wahrscheinlich nicht unterdrücken verwenden und sollen stattdessen erforderlich Verwendung.

Das bedeutet, es jede Transaktion wird unterdrückt, die derzeit in der Tat sein könnte, wenn Sie Ihren Code-Block eingeben, so dass alle Aktualisierungen Code nicht Rollback macht, wenn die äußere „ambient“ Transaktion rückgängig zu machen entscheidet.

Dies ist der Artikel, den wir bei der Lösung unserer eigenen, ähnlichen Problem verwendet:

Fehlerbehebung Probleme mit MSDTC

Dies ist im Grunde ein Nachtrag zur Nikolay R Antwort. Er bereits einige der Vorschläge abgedeckt im Artikel aufgeführt.

. Hinweis: Der Artikel ist Teil der Biztalk Dokumentation, aber es kann etwas mit MSDTC anwenden

„Wenn Sie Entity Framework verwenden, um mit Transaktionen, automatisch Entity Framework öffnet und schließt eine Verbindung mit jedem Datenbank-Aufruf. Also, wenn Transaktionen verwendet, versuchen Sie, eine Transaktion verteilt über mehrere Verbindungen. Dies erhöht zu MSDTC.“

Sie können in der Datenbank Kontext übergeben Klasse oder Funktion in der Transaktion callee.

Vielleicht ist Ihre Antwort: MSSQL Fehler ‚Der zugrunde liegende Anbieter auf Öffnen failed‘

Unterdrücken der Transaktion ist nützlich, wenn Sie einen Code ausführen möchten, die fehlschlagen könnten, aber Sie wollen nicht, die Transaktion abzubrechen, weil das nicht können.

Die Frage, die Sie sich stellen müssen, ist die folgende: Sind Sie mit mehr als 1 dauerhafter Ressource in Ihrer Transaction? Ich meine, Sie offene Verbindungen zu mehr als 1 DB?

Dies ist eine wichtige Frage, die Transaktion zu DTC eskaliert werden, wenn Sie mehr als 1 dauerhafter Ressource zugreifen.

Mindestens zwei dauerhafte Ressourcen, die einphasige Notifikationen werden in der Transaktion eingetragen. Zum Beispiel ist eine einzige Verbindung mit Anwerbung eine Transaktion nicht dazu führen, gefördert werden. Jedes Mal, wenn Sie eine zweite Verbindung zu einer Datenbank öffnen, wodurch sie die Datenbank zu gewinnen, erkennt die System.Transactions Infrastruktur, dass es die zweite dauerhafte Ressource in der Transaktion ist, und eskaliert es zu einer MSDTC-Transaktion. Quelle: MSDN

Wenn das der Fall ist, können Sie Ihr Problem lösen, indem Sie Ihre transactionscopes richtig nisten, Beispiel:

//Create rootScope
using(TransactionScope rootScope = new TransactionScope()) 
{ 
    using(TransactionScope scope2 = new 
    TransactionScope(TransactionScopeOption.Required)) 
    {
         //Do work on DB1
         ...

         //Complete this ambient transaction
         scope2.Complete();
    } 

    using(TransactionScope scope3 = new 
    TransactionScope(TransactionScopeOption.Required)) 
    {
         //Do work on DB2
         ...

         //Complete this ambient transaction
         scope3.Complete();
    } 

    //Complete rootScope
    //The whole transaction will only be committed if you call 
    //Complete on the rootScope
    rootScope.Complete();

}

Sie können weitere Informationen über TransactionScopes finden, wie Verschachtelung funktioniert, ... auf MSDN .

Ich hoffe, dass diese Antwort der Menschen in der Zukunft helfen kann.

Wenn Distributed Transaction Coordinator-Dienst nicht gestartet wird, kann Entity Framework Datenbank nicht verbinden. Öffnen und starten Sie den Distributed Transaction Coordinator

Dienste -> Distributed Transaction Coordinator

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top