Чи буде використання оператора відкотом транзакції бази даних у разі виникнення помилки?


83

Я отримав IDbTransaction у операторі using, але я не впевнений, чи буде він відкочений, якщо в операторі using буде вилучено виняток. Я знаю, що оператор using буде примушувати викликати Dispose () ... але чи хтось знає, чи те саме стосується відкату ()?

Оновлення: Крім того, чи потрібно мені зателефонувати комітету Comm () явно, як у мене нижче, чи про це також подбає оператор 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
Привіт, просто для роз’яснення справи "скоєння". Це звичайно обов’язково, оскільки, using () {} просто викликає метод Dispose (). Клас Transaction.Dispose не міг знати, чи слід робити коміт чи розпоряджатися, якщо
коміт

Відповіді:


104

Метод Dispose для класу транзакцій виконує відкат, тоді як клас Oracle цього не робить. Тож з точки зору транзакції це залежить від реалізації.

З usingіншого боку, оператор для об'єкта з'єднання або закриє з'єднання з базою даних, або поверне з'єднання в пул після його скидання. У будь-якому випадку, непогашені операції слід скасувати. Ось чому виняток ніколи не залишає активних транзакцій.

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


Буде, я навіть один раз перевірив це, явно викинувши виняток.
Павел Краковяк,

1
Це є дивним, але це працює для інших реалізацій IDbTransaction , якщо ви використовуєте його для крос-сумісність дб?
Метт Гамільтон,

4
@mezoid: Фіксація ніколи не відбудеться автоматично. @matt: Вони повинні, за задумом.
Седат Капаноглу

1
@MattHamilton саме так, як сказав ssg. Я перевірив джерело роз'єму .net MySQL, вони теж зробили те саме, що показано вище. Rollbackвикликається Dispose! :)
nawfal

1
Якщо ви використовуєте a System.Data.OracleConnection, він не відкочується при утилізації. Або, принаймні, для нас це не так.
Medinoc

20

Ви повинні зателефонувати коміту. Заява using не буде нічого робити для вас.


5
Так, користувач викликає Dispose при виході, який викликає відкат, а не комітувати.
трепет

4

Я вважаю, що якщо існує виняток, який Commit()ніколи не викликався, транзакція автоматично відкачується.


Так, це моє розуміння. Транзакція діє доти, доки не буде викликано коміт або закінчиться зв’язок. На той момент журнал транзакцій фактично оновлюється із змінами або відкочується у випадку закритого з'єднання (ви знаєте, що ніколи не отримаєте коміт із закритого з'єднання;)).
Mike
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.