2010-08-27 18 views
5

Ich habe eine Multithread-C# -Anwendung, bei der jeder Thread seinen eigenen Satz von DB-Verbindungen hat. Jeder Thread verwendet TransactionScope/DTC. Manchmal bekomme ich eine Ausnahme "Die Transaktion wurde abgebrochen". Es ist nicht von einer Zeitüberschreitung, da es in weniger als 2 Sekunden nach dem Start der Transaktion auftritt.Die Transaktion wurde abgebrochen

Hier ist der Stacktrace:

bei System.Transactions.TransactionStateAborted.BeginCommit (InternalTransaction tx, Boolean asyncCommit, AsyncCallback AsyncCallback, Object AsyncState) bei System.Transactions.CommittableTransaction.Commit() bei System.Transactions.TransactionScope.InternalDispose() bei System.Transactions.TransactionScope.Dispose() bei MyNamespace.CallingMethod()

Es passiert sehr selten, sagen einmal in 100.000 Transaktionen.

Umwelt: Windows Server 2003 .Net 2.0 Anschluss an SQL Server 2005

Alle Ideen, warum dies auftreten? Danke!

+0

funktioniert die SQL, DTC, oder OS-Fehlerprotokolle haben die weiteren Einzelheiten? – StingyJack

+0

Einträge in den Ereignisprotokollen mit diesem Zeitstempel? –

+0

Produktionsbox, so dass es schwierig ist, dort irgendwelche Informationen ohne Bürokratie zu bekommen. Ich werde sehen, ob ich etwas aus dem Event Log holen kann, das ist einfacher. Vielen Dank! – Dan

Antwort

0

Ich denke, das wird Netzwerkinstabilität zugeschrieben. Es ist sehr selten und hat seinen hässlichen Kopf seit einigen Monaten nicht mehr aufgezogen.

1

Ist dieser Aufrufstack von Ihrer innersten InnerException? Ich bekomme diese Ausnahmen, es gibt normalerweise (nicht immer, obwohl) eine InnerException mit mehr Informationen.

Meine Wette wäre auf einem Datenbank-Deadlock.

+0

Ja, das war die innerste Ausnahme. Ich habe Zugriff auf Deadlock-Spuren, und während dieser Zeit wurden keine gefunden. – Dan

1

Sie ein Speicherabbild erstellen kann, kann die Anweisung gefunden http://blogs.msdn.com/b/joncole/archive/2007/03/29/creating-a-process-memory-dump.aspx

hier Dann können Sie mit windbg überprüfen, um zu zeigen, was root Ausnahme ist dieses Problem verursacht. Es gibt viele nützliche Informationen zur Verwendung von windbg, um die verwaltete Ausnahme zu überprüfen.

In der Zwischenzeit können Sie sql profiler verwenden, um zu überwachen, ob irgendein SQL-Fehler um den Zeitpunkt aufgetreten ist, als die Ausnahme ausgelöst wurde.

+0

Ich mag diese Idee. Ich werde es erneut versuchen und in Dev neu erstellen und eine Antwort auf dieses Problem bekommen. – Dan

+0

Wenn Sie einen Speicherauszug haben, kann ich es für Sie überprüfen. Sie können es auf skydrive Öffentlichen Ordner legen. –

0

Wie Andreas sagte, schau dir die InnerExceptions an. Verbinden Sie auch SQL Profiler und suchen Sie nach Deadlocks/terminiert.

1

Wenn jemand von Ihnen mit diesem Problem konfrontiert wird, bitte beachten Sie, dass ich die Lösung und das Problem gefunden .. In der App-Konfigurationsdatei, eine Eigenschaften für die Verbindungszeichenfolge fehlt, die die "Enlist" war ,.

Zuvor hat die Verbindungszeichenfolge war = <add name="HIS_Test_12" connectionString="server=OXYGEN\SQL2008ENT;database=CHIS_VN_12;UID=sa;Password=1234;Max Pool Size=100;Connect Timeout=200;" providerName="System.Data.SqlClient" />

nun die aktualisierte Verbindungszeichenfolge = <add name="HIS_Test_12" connectionString="server=OXYGEN\SQL2008ENT;database=CHIS_VN_12;UID=sa;Password=1234;Max Pool Size=100;Connect Timeout=200;Enlist=False;" providerName="System.Data.SqlClient" />

Verwandte Themen