如果发生错误,使用语句会回滚数据库事务吗?

我在using语句中有一个IDbTransaction,但是我不确定在using语句中是否抛出exception,是否会回滚。 我知道一个使用语句将强制执行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(); } } 

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

你必须调用commit。 using语句不会为你提供任何东西。

我相信,如果有一个例外从不调用Commit(),那么事务将自动回滚。