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

mez*_*oid 81 c# transactions using-statement rollback

我在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();
    }
}
Run Code Online (Sandbox Code Playgroud)

Sed*_*glu 101

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

__PRE__

编辑:@ Medinoc提到using不这样做,所以看起来具体实现.

  • @mezoid:提交永远不会自动发生.@matt:他们应该按照设计. (4认同)
  • @MattHamilton 正如 ssg 所说。我检查了 MySQL 的 .net 连接器源,它们也如上所示。`Rollback` 在 `Dispose` 中被调用!:) (2认同)

jha*_*ale 19

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

  • 是的,using将在退出时调用Dispose,它将调用Rollback,而不是Commit. (5认同)

小智 5

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