2009-08-12 4 views
1

Ich beschäftige mich mit einer interessanten Situation, in der ich viele Datenbankaktualisierungen in einer einzigen Transaktion durchführe. Wenn diese Aktualisierungen aus irgendeinem Grund fehlschlagen, wird die Transaktion zurückgesetzt.IDbTransaction Rollback Timeout

IDbTransaction transaction 
try { 
    transaction = connection.BeginTransaction(); 

    // do lots of updates (where at least one fails) 

    transaction.Commit(); 
} catch { 
    transaction.Rollback(); // results in a timeout exception 
} finally { 
    connection.Dispose(); 
} 

Ich glaube, der obige Code im Allgemeinen die Standardvorlage für die Durchführung Datenbankaktualisierungen innerhalb einer Transaktion in Betracht gezogen wird.

Das Problem, mit dem ich konfrontiert bin, ist, dass, während transaction.Rollback() an SQL Server ausgestellt wird, es auch auf dem Client Zeitlimit ist.

Gibt es eine Unterscheidung zwischen einem Timeout zum Ausgeben des Rollback-Befehls und einem Zeitlimit für die Ausführung dieses Befehls?

Vielen Dank im Voraus, Ben

Antwort

0

sollten Sie besondere Fänge angeben das heißt an den verschiedenen Ausnahmen suchen, die ausgelöst werden. Wenn beim Verarbeiten des Befehls sql ein Fehler auftritt, sollte eine SqlException ausgelöst werden. Fangen Sie die verschiedenen Ausnahmen ein, die in Ihrem Projekt unterschieden werden sollen.

Weiter mehr könnten Sie auch fangen und das Programm für

Ausnahme - Fehler beim Versuch, die Transaktion zu begehen.

InvalidOperationException - Die Transaktion wurde bereits festgeschrieben oder zurückgesetzt. -oder- Die Verbindung ist unterbrochen.

Andrew

+0

sicher ich die undokumentierte Timeout Ausnahme abfangen können (und die anderen) des transaction.Rollback() -Methode, aber wie genau weiß ich, ob das Rollback aufgetreten ist oder nicht. Ich stelle mir vor, dass die Timeout-Ausnahme in 2 verschiedenen Szenarien ausgelöst wird; der erste war, wenn der Rollback-Befehl nicht an SQL Server und der zweite ausgegeben werden konnte, wenn der Rollback-Befehl ausgegeben wurde, aber zu lange dauerte ... –

+0

Ich habe eine weitere Implementierung Ihres obigen Beispiels gesehen, wo es einen weiteren Versuch gibt Der Rollback-Methodenaufruf, hier würden Sie dann Ausnahmen abfangen, die von der Rollback-Prozedur selbst ausgelöst werden. Auch dies könnte eine sql-Ausnahme sein, wenn es nicht zurückgesetzt werden konnte, eine Ausnahme, die ich für eine Zeitüberschreitung oder eine ungültige Operation für bestimmte transaktionsbezogene Fehler halten würde. –