DbTransaction 的Commit() 或Rollback() 抛出异常如何处理?

How to handle if DbTransaction's Commit() or Rollback() throw exception?

我正在使用 Visual Studio 2012 和 MS SQL Server 2008 R2。

在我的代码中,我使用了 DbConnectionDbTransaction。这是我的代码:

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#程序员通常如何处理这种情况?或者他们不处理这种情况?

您将任何方法(CommitRollback)中的异常处理为事务失败。如果您 want/have 这样做,您可以清理 C# 代码中的某些内容。数据库清理将自动处理(至少,对于符合 ACID 的数据库)。

是的,CommitRollback都可以抛出异常。但是,这些可能应该向上传播并记录或作为错误显示给用户。您希望如何处理错误完全取决于您,但通常错误是由于连接关闭造成的。其次,你应该利用 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();
}