【问题标题】:.net TransactionScope Exception.net TransactionScope 异常
【发布时间】:2010-01-07 14:08:23
【问题描述】:

我的代码是这样的

try
{
    using (TransactionScope iScope = new TransactionScope())
    {
        try
        {
            isInsertSuccess = InsertProfile(account);
        }
        catch (Exception ex)
        {
            throw;
        }

        if (isInsertSuccess)
        {
            iScope.Complete();
            retValue = true;
        }
    }
}
catch (TransactionAbortedException tax)
{
    throw;
}
catch (Exception ex)
{
    throw;
}

现在发生的情况是,即使我的值为 TRUE,TransactionAbortedException 异常也会随机发生,但数据会在 DB 中插入/更新。

知道出了什么问题吗?

【问题讨论】:

  • 你为什么要声明三个名为 rethrow 的变量而不用它们做任何事情?另外,为什么你有两个相同的catch 块用于不同类型的异常?
  • 如果您遇到间歇性错误,问题可能不在于这段孤立的代码,而可能是与其他代码的集成引起的,例如数据库死锁。错误信息是什么意思?
  • @SLaks isInsertSuccess 值为 TRUE

标签: c# .net transactions


【解决方案1】:

正如TransactionAbortedException 文档所说,

尝试时也会抛出此异常 提交交易和 交易中止。

这就是为什么即使在调用Transaction.Complete 之后也会看到异常的原因:Complete 方法与Commit 不同:

调用此方法 [TransactionScope.Complete] 并不能保证 事务的提交。这是 只是一种通知方式 您状态的交易经理

在退出 using 语句之前不会提交事务:有关详细信息,请参阅CommittableTransaction.Commit 文档。此时参与交易的任何操作都可以投票中止交易,您将获得TransactionAbortedException

要调试底层问题,您需要分析异常详细信息和堆栈跟踪。正如 Mark 在评论中指出的那样,这很可能是由死锁或与其他数据库进程的其他交互引起的。

【讨论】:

  • +1 很好的解释,特别指出 Complete 只是一个投票。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 1970-01-01
  • 2018-03-13
相关资源
最近更新 更多