У меня есть 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();
}
}
Ответы:
Метод Dispose для класса транзакции выполняет откат, а класс Oracle - нет. Так что с точки зрения транзакции это зависит от реализации.
С
using
другой стороны, оператор для объекта соединения либо закроет соединение с базой данных, либо вернет соединение с пулом после его сброса. В любом случае невыполненные транзакции следует откатить. Вот почему исключение никогда не оставляет активной транзакции.Кроме того, да, вы должны звонить
Commit()
явно.источник
Rollback
вызываетсяDispose
! :)System.Data.OracleConnection
, он не будет откатываться при удалении. По крайней мере, для нас это не так.Вы должны вызвать фиксацию. Оператор using ничего за вас не зафиксирует.
источник
Я считаю, что если есть исключение, которое
Commit()
никогда не было вызвано, транзакция автоматически откатится.источник