Будет ли оператор 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() никогда не вызывался, то транзакция автоматически откатится.

Другие вопросы по тегам