Будет ли оператор 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 72

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

Вы должны вызвать commit. Оператор using ничего для вас не сделает.

Я считаю, что если есть исключение, такое, что Commit() никогда не вызывался, то транзакция автоматически откатится.