我在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();
}
}
答案 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(),那么事务将自动回滚。