2013-10-30 8 views
6

Ich habe eine C# -Anwendung, die Daten in einer Tabelle in einer SQL Server-Datenbank mithilfe von Transaktionen bearbeitet. Der Code ist sehr einfach und geht im Grunde wie folgt:Datenbanktabelle bleibt gesperrt, wenn Clientprozess nach Transaktionsstart beendet wird

public string ConnectionString; 
public OleDbConnection DbConnection; 
public OleDbTransaction DbTransaction; 

// ... some initialization stuff ... 

DbTransaction = DbConnection.BeginTransaction(); 
try 
{ 
    // ... some insert/update/delete here ... 
    DbTransaction.Commit(); 
} 
catch (Exception e) 
{ 
     // ... 
     DbTransaction.Rollback(); 
} 

nun eine Situation, von einem Kunden berichtet wurde, dass der Tisch/rowset gesperrt blieb, während es keine aktive Anwendungsinstanz ausgeführt wurde. Seine erste Vermutung war, dass während der Transaktion ein Fehler aufgetreten ist und kein Try-Catch-Block mit einem Rollback vorhanden ist (aber dies ist definitiv nicht der Fall, da es eine korrekte Fehlerbehandlung gibt). Ich kann die Situation reproduzieren, wenn ich einen Breakpoint im Debugger vor DbTransaction.Commit(); setze und dann den Prozess vom Windows Task-Manager abbringe. Dann bleibt die Transaktion offen (ich kann es laufen sehen DBCC OPENTRAN) und eine Sperre bleibt, die weitere Arbeit mit einer neuen Instanz der Anwendung verhindert.

Meine Frage: Wie kann ich eine Situation wie diese sicher behandeln - der Prozess wird nach dem Start der Transaktion beendet und hat keine Chance, die Transaktion zu bestätigen/rückgängig zu machen? Soweit ich weiß, kann ich nicht erkennen, ob die Anwendung vom Task-Manager gelöscht wird (Registerkarte "Prozess"). Kann ich die Transaktion irgendwie automatisch abbrechen (z. B. nach einer Zeitüberschreitung) oder was kann ich noch tun? Bitte helfen Sie.

+0

Nicht wirklich ein fix, aber können Sie tun dies mit weniger als einer Tabellensperre? Können Sie kleinere Transaktionen durchführen? – Paparazzi

Antwort

Verwandte Themen