Будет ли оператор using откатывать транзакцию базы данных в случае возникновения ошибки? - PullRequest
79 голосов
/ 13 марта 2009

У меня есть 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 ]

100 голосов
/ 13 марта 2009

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

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

Также, да, вам следует явно позвонить Commit().

19 голосов
/ 14 марта 2009

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

4 голосов
/ 13 марта 2009

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

...