如果发生错误,using语句是否会回滚数据库事务?

时间:2009-03-13 06:32:41

标签: c# transactions rollback using-statement

我在using语句中有一个IDbTransaction,但我不确定如果在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 个答案:

答案 0 :(得分:97)

显然是(适用于SQL Server)。这是SqlInternalTransaction的Dispose方法(SqlTransaction的Dispose调用)从Reflector看起来的样子:

private void Dispose(bool disposing)
{
    // ...
    if (disposing && (this._innerConnection != null))
    {
        this._disposing = true;
        this.Rollback(); // there you go
    }
}

编辑:@ Medinoc提到OracleConnection没有这样做,所以看起来似乎是特定于实现。

答案 1 :(得分:18)

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

答案 2 :(得分:4)

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