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

c# transactions rollback using-statement

28072 观看

3回复

16868 作者的声誉

我在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();
    }
}
作者: mezoid 的来源 发布者: 2009 年 3 月 13 日

回应 (3)


99

35421 作者的声誉

决定

显然是(对于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不这样做,所以看起来具体实现。

作者: Sedat Kapanoglu 发布者: 13.03.2009 06:38

4

1265 作者的声誉

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

作者: Tommy Hui 发布者: 13.03.2009 06:38

19

1029 作者的声誉

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

作者: jhale 发布者: 14.03.2009 12:57
32x32