Verteilte Transaktion abgeschlossen Führen Sie diese session entweder in einer neuen Transaktion oder in der NULL-Transaktion ein

Nur neugierig, ob noch jemand diesen besonderen Fehler hat und wissen, wie man ihn triggers?

Das Szenario ist wie folgt …

Wir verfügen über eine ASP.NET-Webanwendung, die die Enterprise-Bibliothek verwendet, die auf der Windows server 2008-IIS-Farm ausgeführt wird und eine Verbindung mit einem SQL server 2008-Cluster-Back-End herstellt. MSDTC ist eingeschaltet. DB-Verbindungen werden zusammengefasst.

Mein Verdacht ist, dass irgendwo in der Zeile eine MSDTC-Transaktion fehlgeschlagen ist, die Verbindung wurde in den Pool zurückgegeben und die nächste Abfrage auf einer anderen Seite nimmt die errorshafte Verbindung auf und hat diesen speziellen Fehler bekommen. Komische Sache ist, dass wir diesen Fehler bei einer Abfrage bekommen haben, die bei verteilter Transaktion (die zu zwei databaseen usw. verpflichtet) keinerlei Notwendigkeit hat. Wir haben nur eine Auswahlabfrage (keine Transaktion) durchgeführt, als der Fehler aufgetreten ist.

Wir haben SQL Profiling durchgeführt und die Abfrage wurde auf dem SQL server ausgeführt, kam aber nie zurück (da die MSDTC-Transaktion in der Verbindung bereits abgebrochen wurde).

Einige andere damit zusammenhängende Fehler sind:

  • Neue Anforderung darf nicht gestartet werden, da sie mit einem gültigen Transaktionsdeskriptor geliefert werden sollte.
  • Interner .Net Framework Data Provider Fehler 60.

Solutions Collecting From Web of "Verteilte Transaktion abgeschlossen Führen Sie diese session entweder in einer neuen Transaktion oder in der NULL-Transaktion ein"

Eine Prämie kann helfen, die Antwort zu erhalten, die Sie suchen, aber Sie werden wahrscheinlich bessere Antworten erhalten, wenn Sie einige Codebeispiele geben und eine bessere Beschreibung geben, wann der Fehler auftritt.

Tritt der Fehler nur zeitweise auf? Es klingt nach deiner Beschreibung.

Schließen Sie den Abschluss ein, der als Transaktion in einem using TransactionScope Block ausgeführt werden soll, wie von Microsoft empfohlen? Dies sollte dazu beitragen, seltsames Transaktionsverhalten zu vermeiden. Erinnern Sie sich daran, dass ein using Block dafür sorgt, dass das object unabhängig von den ausgetriggersen exceptionn immer verworfen wird. Siehe hier: http://msdn.microsoft.com/en-us/library/ms172152.aspx

Wenn Sie TransactionScope gibt es ein Argument System.TransactionScopeOption.RequiresNew , das dem Framework System.TransactionScopeOption.RequiresNew dass immer eine neue Transaktion für diesen Codeblock erstellt werden soll:

  Using ts As New Transactions.TransactionScope(Transactions.TransactionScopeOption.RequiresNew) ' Do Stuff End Using 

Wenn Sie verdächtig sind, dass eine Verbindung errorshaft ist und dann wieder in den Verbindungspool eingefügt wird, besteht die wahrscheinliche Lösung darin, den Code, der die Verbindung in einem Try-Catch-Block und die Verbindung im Catch-Block Dispose kann, einzuschließen.

MSDTC hat standardmäßig 90 Sekunden timeüberschreitung. Wenn eine Abfrage ausgeführt wird, überschreiten Sie dieses timelimit. Dieser Fehler tritt auf, wenn die Transaktion versucht, zu committen.

Alte Frage … aber ist in den letzten Tagen auf dieses Problem gestoßen.

Konnte bis jetzt keine gute Antwort finden. Ich wollte nur teilen, was ich herausgefunden habe.

Mein Szenario enthält mehrere sessionen, die von mehreren sessionsfactorys geöffnet werden. Ich musste das Rollback korrekt durchführen und warten und sicherstellen, dass die anderen transactions nicht mehr aktiv waren. Es scheint so, als würde nur eine davon zurückrollen, alles zurückrollen.

Aber nach dem Hinzufügen der Thread.Sleep () zwischen Rollbacks, tut es nicht die andere und fährt gut mit dem Rollback. Nachfolgende Treffer, die die Methode auslösen, führen nicht dazu, dass "Neue Anfrage nicht gestartet werden darf, weil sie mit einem gültigen Transaktionsdeskriptor kommen sollte". Error.

https://gist.github.com/josephvano/5766488

Ich habe das schon einmal gesehen und die Ursache war genau das, was du dachtest. Wie von Rice vorgeschlagen, stellen Sie sicher, dass Sie die db-bezogenen objecte korrekt entsorgen, um dieses Problem zu vermeiden.