代码之家  ›  专栏  ›  技术社区  ›  mezoid

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

  •  75
  • mezoid  · 技术社区  · 16 年前

    我在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 回复  |  直到 8 年前
        1
  •  95
  •   Sedat Kapanoglu johnnywhoop    8 年前

    显然是的(对于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 不会这样做,因此它似乎是特定于实现的。

        2
  •  18
  •   jhale    16 年前

    你得叫承诺。using语句不会为您提交任何内容。

        3
  •  4
  •   Tommy Hui    16 年前

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