如何知道交易范围是否成功

时间:2019-05-04 05:06:09

标签: c#

我需要知道我的交易范围是否成功。就像记录是否能够保存在数据库中一样。

注意:我在Service层中拥有此作用域,并且我不希望包含Try-Catch块。

bool txExecuted;

using (var tx = new TransactionScope())
{
   //code
   // 1 SAVING RECORDS IN DB
   // 2 SAVING RECORDS IN DB

   tx.Complete();
   txExecuted = true;
}

if (txExecuted ) {

   // SAVED SUCCESSFULLY
} else {
  // NOT SAVED. FAILED
}

2 个答案:

答案 0 :(得分:1)

注释的代码将进行更新,并可能使用ExecuteNonQuery()实现-这将返回受影响的行数的整数。跟踪所有返回值以了解受影响的行数。

整个事务在完成时将成功或遇到异常。如果没有遇到异常,则说明事务成功。如果发生异常,则事务的某些部分失败;没有发生

通过考虑这两个事实(记录受影响的计数,事务异常或否),您可以知道保存是否起作用以及受影响的行数

我不太了解txExecuted的用途-如果发生异常,则永远不会设置该异常,也不会考虑if。因此,将运行的唯一代码是if(true)内部的东西。我看不到如何决定不使用try / catch,并希望对旨在在出现问题时引发异常的系统做任何有用的事情。您说不想捕获异常不会阻止异常的发生并影响程序的控制流

答案 1 :(得分:0)

要清楚,调用Complete()方法只是表示范围内的所有操作均已成功完成的指示。

  

但是,您还应该注意,调用此方法不会   保证交易的提交。这只是一种通知方式   您的状态的交易经理。调用此方法后,您   不能再通过Current属性访问环境交易,   并尝试这样做会引发异常。

     

资源管理器之间的实际提交工作发生在   如果TransactionScope对象创建了End Using语句,   交易。

由于使用的是ADO.NET,ExecuteNonQuery将返回受影响的行数。您可以在使用块的提交和外部之后进行数据库查找。

在我看来,没有尝试/捕获是一个错误。您想捕获TransactionAbortedException日志异常。

try
{
    using (var scope = new TransactionScope())
    {
        using (var conn = new SqlConnection("connection string"))
        {

        }

        // The Complete method commits the transaction. If an exception has been thrown,
        // Complete is not  called and the transaction is rolled back.
        scope.Complete();
    }
}
catch (TransactionAbortedException ex)
{
    // log
}