Ich habe eine IDbTransaction in einer using-Anweisung, bin mir jedoch nicht sicher, ob sie zurückgesetzt wird, wenn in einer using-Anweisung eine Ausnahme ausgelöst wird. Ich weiß, dass eine using-Anweisung den Aufruf von Dispose () erzwingt ... aber weiß jemand, ob dies auch für Rollback () gilt?
Update: Muss ich Commit () auch explizit aufrufen, wie unten beschrieben, oder wird dies auch durch die using-Anweisung erledigt?
Mein Code sieht ungefähr so aus:
using Microsoft.Practices.EnterpriseLibrary.Data;
...
using(IDbConnection connection = DatabaseInstance.CreateConnection())
{
connection.Open();
using(IDbTransaction transaction = connection.BeginTransaction())
{
//Attempt to do stuff in the database
//potentially throw an exception
transaction.Commit();
}
}
c#
transactions
rollback
using-statement
Mezoid
quelle
quelle
Antworten:
Die Dispose-Methode für die Transaktionsklasse führt ein Rollback durch, während die Oracle-Klasse dies nicht tut. Aus Sicht der Transaktion ist die Implementierung also abhängig.
Die
using
Anweisung für das Verbindungsobjekt würde andererseits entweder die Verbindung zur Datenbank schließen oder die Verbindung nach dem Zurücksetzen an den Pool zurückgeben. In beiden Fällen sollten die ausstehenden Transaktionen zurückgesetzt werden. Aus diesem Grund lässt eine Ausnahme niemals eine aktive Transaktion herumliegen.Ja, Sie sollten auch
Commit()
explizit anrufen .quelle
Rollback
wird gerufenDispose
! :)System.Data.OracleConnection
, wird es bei der Entsorgung nicht zurückgesetzt. Zumindest für uns nicht.Sie müssen Commit aufrufen. Die using-Anweisung legt nichts für Sie fest.
quelle
Ich glaube, wenn es eine Ausnahme gibt,
Commit()
die nie aufgerufen wurde, wird die Transaktion automatisch zurückgesetzt.quelle