Будет ли используемый оператор откат транзакции базы данных при возникновении ошибки?

У меня есть 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();
    }
}

Ответ 1

Метод Dispose для класса транзакции выполняет откат, а класс Oracle - нет. Так что с точки зрения транзакции это зависит от реализации.

Оператор using для объекта соединения, с другой стороны, будет либо закрывать соединение с базой данных, либо возвращать соединение с пулом после его сброса. В любом случае невыполненные транзакции следует откатить. Вот почему исключение никогда не оставляет активную транзакцию.

Кроме того, да, вы должны явно вызывать Commit().

Ответ 2

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

Ответ 3

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