Будет ли оператор using откатывать транзакцию базы данных, если произойдет ошибка?
У меня есть IDbTransaction в операторе using, но я не уверен, будет ли он откатываться, если в операторе using возникнет исключение. Я знаю, что оператор using принудительно вызовет Dispose ()...но кто-нибудь знает, верно ли то же самое для Rollback()?
Update: Кроме того, нужно ли вызывать Commit() явно, как показано ниже, или об этом также позаботится оператор using?
Мой код выглядит примерно так:
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();
}
}
3 ответа:
По-видимому, да (для SQL Server). Вот как метод Dispose SqlInternalTransaction (который вызывает Sqltransaction Dispose) выглядит из Reflector:
private void Dispose(bool disposing) { // ... if (disposing && (this._innerConnection != null)) { this._disposing = true; this.Rollback(); // there you go } }
EDIT: @Medinoc упоминал, что
OracleConnection
этого не делает, поэтому он кажется специфичным для реализации.