如果发生错误, using 语句是否会回滚数据库事务? [英] Will a using statement rollback a database transaction if an error occurs?

查看:20
本文介绍了如果发生错误, using 语句是否会回滚数据库事务?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I've got an IDbTransaction in a using statement but I'm unsure if it will be rolled back if an exception is thrown in a using statement. I know that a using statement will enforce the calling of Dispose()...but does anyone know if the same is true for Rollback()?

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

Update: Also, do I need to call Commit() explicitly as I have below or will that also be taken care of by the using statement?

我的代码看起来像这样:

My code looks sort of like this:

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 的类不执行.因此,从事务的角度来看,它依赖于实现.

Dispose method for transaction class performs a rollback while Oracle's class doesn't. So from transaction's perspective it's implementation dependent.

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

The using statement for the connection object on the other hand would either close the connection to the database or return the connection to the pool after resetting it. In either case, the outstanding transactions should be rolled back. That's why an exception never leaves an active transaction lying around.

另外,是的,您应该显式调用 Commit().

Also, yes, you should call Commit() explicitly.

这篇关于如果发生错误, using 语句是否会回滚数据库事务?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆