2009-06-30 8 views
20

Nur neugierig, ob jemand diesen besonderen Fehler hat und wissen, wie man es löst?Verteilte Transaktion abgeschlossen. Entweder registrieren Sie diese Sitzung in einer neuen Transaktion oder die NULL-Transaktion

Das Szenario ist wie folgt ...

Wir haben eine ASP.NET Web-Anwendung mit Enterprise Library unter Windows Server 2008 IIS Farm auf einen Server 2008 Cluster-Backend SQL verbindet. MSDTC ist eingeschaltet. DB-Verbindungen werden zusammengefasst.

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

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

Einige andere ähnliche Fehler, dies zu begleiten, sind:

  • Neue Anfrage nicht erlaubt ist gestartet werden, da es mit gültigen Transaktionsbeschreiber kommen soll.
  • Internal .Net Framework Data Provider Fehler 60.
+0

Haben Sie etwas darüber herausgefunden? Ich bekomme es beim Einfügen größerer Datensätze (> 10K Zeilen). – StingyJack

Antwort

3

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

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

Schließen Sie den Abschluss ein, den Sie als eine Transaktion in einem using TransactionScope-Block ausführen möchten, wie Microsoft empfiehlt? Dies sollte dazu beitragen, seltsames Transaktionsverhalten zu vermeiden. Erinnern Sie sich daran, dass ein using Block sicherstellt, dass das Objekt immer ungeachtet der ausgelösten Ausnahmen entsorgt wird. Siehe hier: http://msdn.microsoft.com/en-us/library/ms172152.aspx

Wenn Sie mit TransactionScope gibt es ein Argument System.TransactionScopeOption.RequiresNew, die den Rahmen eine neue Transaktion für diesen Codeblock immer erstellen sagt:

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

Auch, wenn Sie Es ist verdächtig, dass eine Verbindung fehlerhaft ist und dann wieder in den Verbindungspool eingefügt wird. Die wahrscheinlichste Lösung besteht darin, den Code, der die Verbindung in einem Try-Catch-Block und Dispose die Verbindung im Catch-Block beschädigen kann, einzuschließen.

+0

Nur zur Klarstellung, mir wurde gesagt, dass Sie Ihre SQL-Verbindung nur für den Fall, dass die Verbindung in einen fehlerhaften Zustand geht, entsorgen möchten; Andernfalls können Sie die Verbindungen nicht zusammenfassen. –

0

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

3

MSDTC hat standardmäßig 90 Sekunden Zeitüberschreitung. Wenn eine Abfrage ausgeführt wird, überschreitet dieses Zeitlimit diesen Fehler, wenn die Transaktion versucht, zu committen.

+0

Das war es für mich! (Nicht sicher, warum dies einen Downvote hatte.) – Vaccano

1

Alte Frage ... aber lief in den letzten Tagen in diese Angelegenheit.

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

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

Aber nach dem Hinzufügen der Thread.Sleep() zwischen Rollbacks, tut es nicht das 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