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