如何处理如果DbTransaction';s Commit()或Rollback()引发异常

本文关键字:Commit Rollback 异常 何处理 处理 如果 DbTransaction | 更新日期: 2023-09-27 18:19:59

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

如何处理如果DbTransaction';s Commit()或Rollback()引发异常

是的,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将自动回滚其dispose方法(假设尚未提交)。此代码引发的异常通常不是您可以优雅处理的。在大多数情况下,它们可能来自SQL错误(无效语法、FK错误等)或关闭的连接。

只要您有一个好的日志记录系统,上面的代码就应该是您所需要的。

使用只有Complete()TransactionScope。一旦它被释放,它将回滚基础事务。任何异常都会导致底层事务也被回滚:

using (var scope = new TransactionScope())
using (var connection = new SqlConnection(...))
{
    // do stuff
    scope.Complete();
}

您将任何方法(CommitRollback)中的异常处理为事务中的失败。如果你想/必须这样做,你可以清理你的C#代码中的一些东西。数据库清理将自动处理(至少对于ACID兼容的数据库)。