【问题标题】:TransactionScope check if transaction commited okTransactionScope 检查事务提交是否正常
【发布时间】:2013-11-08 18:10:58
【问题描述】:

您好,有没有办法检查使用 TransactionScope 的事务是否已提交或回滚?

【问题讨论】:

    标签: c# asp.net-mvc transactionscope


    【解决方案1】:

    在 TransactionScope 被释放之前,实际的 Commit 不会发生。如果 Commit 因任何原因失败,则会抛出异常。您应该捕获该异常并将失败事务的逻辑放在 Catch 块中。如果没有抛出异常,您应该确信 Commit 是成功的。如果出于任何我想不到的原因,您不信任该框架,您可以随时创建另一个 Scope 并查询结果以确保它们已被应用。

    var transactionFailed = false;
    try
    {
        using (var tx = new TransactionScope())
        {
            tx.Complete();
        }
    }
    catch (TransactionAbortedException ex)
    {
        transactionFailed = true;
        writer.WriteLine("TransactionAbortedException Message: {0}", ex.Message);
    
    }
    catch (ApplicationException ex)
    {
        transactionFailed = true;
        writer.WriteLine("ApplicationException Message: {0}", ex.Message);
    }
    catch (Exception ex)
    {
        transactionFailed = true;
        writer.WriteLine("Exception Message: {0}", ex.Message);
    }
    

    【讨论】:

    • FWIW,ApplicationException 被认为是死类。
    【解决方案2】:

    是的。只需添加一个变量并检查它。

    bool txExecuted;
    
    using (var tx = new TransactionScope())
    {
     //code
     if (code was OK)
     {
       tx.Complete();
       txExecuted = true;
     }
    
    }
    

    【讨论】:

    • TransactionScope 没有 Commit 方法。它确实有一个Complete 方法,但调用该方法并不一定会提交事务。
    • 我想知道是不是代码中的事务出了问题。
    • @david2342 - 如果到达事务范围的末尾并且未成功调用 Complete,则回滚并且未设置变量。
    • @StingyJack,如果调用 Complete 并不意味着事务已提交。可能还有另一个尚未完成的环境(更高级别)事务范围。
    • @lightbricko 那你需要把bool放到正确的地方,或者使用多个。这确实回答了 OP 的问题,因为它会告诉您此交易是否已完成。
    【解决方案3】:

    关于 msdn 文档 https://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.complete(v=vs.110).aspx

    // Complete 方法提交事务。如果抛出异常,
    // Complete 没有被调用,事务被回滚。

    completeCallback 方法只有在 transactionScope.Complete() 方法执行成功后才会被调用

    所以你可以使用函数:

    public bool TryRunTransaction(Action transactionAction)
        {
            try
            {
                using (var transactionScope = new TransactionScope())
                {
                    transactionAction();
                    transactionScope.Complete();
                }
                return true;
            }
            catch (TransactionAbortedException)
            {
                return false;
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多