DbTransaction 的Commit() 或Rollback() 抛出异常如何处理?
How to handle if DbTransaction's Commit() or Rollback() throw exception?
我正在使用 Visual Studio 2012 和 MS SQL Server 2008 R2。
在我的代码中,我使用了 DbConnection
和 DbTransaction
。这是我的代码:
DbConnection dbConnection = null;
DbTransaction dbTransaction = null;
try
{
dbConnection = DbProviderFactories.GetFactory("System.Data.SqlClient").CreateConnection();
dbConnection.ConnectionString = connectionString;
dbConnection.Open();
dbTransaction = dbConnection.BeginTransaction();
// do my work using dbConnection and dbTransaction
dbTransaction.Commit();
}
catch (MyWorkFailedException mwfe)
{
dbTransaction.Rollback();
throw;
}
finally
{
if (dbConnection != null)
{
dbConnection.Close();
dbConnection.Dispose();
}
}
dbTransaction.Commit();
或dbTransaction.Rollback();
有没有可能抛出异常?
如果是,那么如何在我的代码中处理它? c#程序员通常如何处理这种情况?或者他们不处理这种情况?
您将任何方法(Commit
和 Rollback
)中的异常处理为事务失败。如果您 want/have 这样做,您可以清理 C# 代码中的某些内容。数据库清理将自动处理(至少,对于符合 ACID 的数据库)。
是的,Commit
和Rollback
都可以抛出异常。但是,这些可能应该向上传播并记录或作为错误显示给用户。您希望如何处理错误完全取决于您,但通常错误是由于连接关闭造成的。其次,你应该利用 using
using (var dbConnection = DbProviderFactories.GetFactory("System.Data.SqlClient").CreateConnection())
{
dbConnection.ConnectionString = connectionString;
dbConnection.Open();
using (var dbTransaction = dbConnection.BeginTransaction())
{
//Do work here
dbTransaction.Commit();
}
}
DbTransaction
将自动回滚其处理方法(假设尚未提交)。此代码抛出的异常通常不是您可以优雅处理的。在大多数情况下,它们将来自 SQL 错误(无效语法、FK 错误等)或关闭的连接。
只要你有一个好的日志系统,上面的代码应该就是你所需要的。
使用 TransactionScope
而不是只有 Complete()
。一旦处理完毕,它将回滚基础事务。任何异常都会导致底层事务也被回滚:
using (var scope = new TransactionScope())
using (var connection = new SqlConnection(...))
{
// do stuff
scope.Complete();
}
我正在使用 Visual Studio 2012 和 MS SQL Server 2008 R2。
在我的代码中,我使用了 DbConnection
和 DbTransaction
。这是我的代码:
DbConnection dbConnection = null;
DbTransaction dbTransaction = null;
try
{
dbConnection = DbProviderFactories.GetFactory("System.Data.SqlClient").CreateConnection();
dbConnection.ConnectionString = connectionString;
dbConnection.Open();
dbTransaction = dbConnection.BeginTransaction();
// do my work using dbConnection and dbTransaction
dbTransaction.Commit();
}
catch (MyWorkFailedException mwfe)
{
dbTransaction.Rollback();
throw;
}
finally
{
if (dbConnection != null)
{
dbConnection.Close();
dbConnection.Dispose();
}
}
dbTransaction.Commit();
或dbTransaction.Rollback();
有没有可能抛出异常?
如果是,那么如何在我的代码中处理它? c#程序员通常如何处理这种情况?或者他们不处理这种情况?
您将任何方法(Commit
和 Rollback
)中的异常处理为事务失败。如果您 want/have 这样做,您可以清理 C# 代码中的某些内容。数据库清理将自动处理(至少,对于符合 ACID 的数据库)。
是的,Commit
和Rollback
都可以抛出异常。但是,这些可能应该向上传播并记录或作为错误显示给用户。您希望如何处理错误完全取决于您,但通常错误是由于连接关闭造成的。其次,你应该利用 using
using (var dbConnection = DbProviderFactories.GetFactory("System.Data.SqlClient").CreateConnection())
{
dbConnection.ConnectionString = connectionString;
dbConnection.Open();
using (var dbTransaction = dbConnection.BeginTransaction())
{
//Do work here
dbTransaction.Commit();
}
}
DbTransaction
将自动回滚其处理方法(假设尚未提交)。此代码抛出的异常通常不是您可以优雅处理的。在大多数情况下,它们将来自 SQL 错误(无效语法、FK 错误等)或关闭的连接。
只要你有一个好的日志系统,上面的代码应该就是你所需要的。
使用 TransactionScope
而不是只有 Complete()
。一旦处理完毕,它将回滚基础事务。任何异常都会导致底层事务也被回滚:
using (var scope = new TransactionScope())
using (var connection = new SqlConnection(...))
{
// do stuff
scope.Complete();
}