Mam IDbTransaction w instrukcji using, ale nie jestem pewien, czy zostanie ona wycofana, jeśli w instrukcji using zostanie zgłoszony wyjątek. Wiem, że instrukcja using wymusi wywołanie metody Dispose () ... ale czy ktoś wie, czy to samo dotyczy Rollback ()?
Aktualizacja: Czy muszę również jawnie wywoływać Commit (), tak jak poniżej, czy też zajmie się tym również instrukcja using?
Mój kod wygląda mniej więcej tak:
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
źródło
źródło
Odpowiedzi:
Metoda Dispose dla klasy transakcji wykonuje wycofanie, podczas gdy klasa Oracle nie. Więc z punktu widzenia transakcji jest to zależne od implementacji.
Z
using
drugiej strony instrukcja obiektu połączenia zamknęłaby połączenie z bazą danych lub zwróciłaby połączenie z pulą po zresetowaniu. W każdym przypadku nierozliczone transakcje należy wycofać. Dlatego wyjątek nigdy nie pozostawia aktywnej transakcji.Również tak, powinieneś zadzwonić
Commit()
wyraźnie.źródło
Rollback
jest wezwanyDispose
! :)System.Data.OracleConnection
, nie cofnie się on przy usuwaniu. A przynajmniej dla nas tak nie jest.Musisz wywołać commit. Instrukcja using nic dla ciebie nie zrobi.
źródło
Uważam, że jeśli istnieje wyjątek, który
Commit()
nigdy nie został wywołany, transakcja zostanie automatycznie wycofana.źródło