85

我在 using 语句中有一个 IDbTransaction,但我不确定如果在 using 语句中引发异常,它是否会回滚。我知道 using 语句将强制调用 Dispose()...但是有谁知道 Rollback() 是否也是如此?

更新:另外,我是否需要像下面那样显式调用 Commit() 或者使用语句也会处理这个问题?

我的代码看起来像这样:

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();
    }
}
4

3 回答 3

106

事务类的 Dispose 方法执行回滚,而 Oracle 的类不执行。因此,从事务的角度来看,它依赖于实现。

using另一方面,连接对象的语句要么关闭与数据库的连接,要么在重置连接后将连接返回到池中。在任何一种情况下,都应该回滚未完成的事务。这就是为什么异常永远不会留下活动事务的原因。

另外,是的,您应该Commit()明确调用。

于 2009-03-13T06:38:08.773 回答
18

你必须调用提交。using 语句不会为您提交任何内容。

于 2009-03-14T00:57:52.453 回答
5

我相信如果有一个Commit()从未调用过的异常,那么事务将自动回滚。

于 2009-03-13T06:38:39.817 回答