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

时间:2015-10-29 22:29:21

标签: c# sql-server transactions

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

3 个答案:

答案 0 :(得分:3)

是的,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错误等)或封闭连接。

只要你有一个好的测井系统,上面的代码应该就是你所需要的。

答案 1 :(得分:1)

您可以将任何方法(CommitRollback)中的异常处理为事务中的失败。如果您需要/必须,您可以清理C#代码中的内容。数据库清理将自动处理(至少对于符合ACID标准的数据库)。

答案 2 :(得分:1)

使用只有TransactionScope的{​​{1}}。处置后,它将回滚基础交易。任何异常都会导致基础事务回滚:

Complete()