如何组织交易

本文关键字:交易 何组织 | 更新日期: 2023-09-27 17:50:36

我已经通过'Guardian'方法调用了服务,该方法为每个请求打开了TransactionScope,如果一切正常,则完成该事务:

void ExecuteWorker(...)
{
    using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew))
    {
        ...CallLogicMethods...
        scope.Complete();
    }
}

其中一个方法与'External'服务交互,如果交互失败,我的所有事务也会失败。因此,我没有保存所需的数据(在请求外部服务之前已计算过)。

void DoLogic1(...)
{
    CalculateSomeData(...);
    SaveCalculatedData(...);
    DoRequestToExternalService(...);
}

解决这个问题的最好方法是什么?

应用程序是使用c#, . net 4.0, MS SQL 2008编写的。

我自己看到两个解决方案

  1. 使用try/catch:

    空白DoLogic11(…){CalculateSomeData(…);

    SaveCalculatedData(…);
    try
    {
        DoRequestToExternalService(...);
    }
    catch(Exception exc)
    {
        LogError(...);
    }
    

    }

这种方法的不足之处在于我对调用者隐藏了异常。但是我想把错误传递到外部作为一个异常(要被记录等)。

  1. 使用"嵌套事务",但我不确定这是如何工作的。

这是我的愿景:

void DoLogic12(...)
{
    using (TransactionScope scopeNested = new TransactionScope(TransactionScopeOption.Suppress))
    {
        CalculateSomeData(...);
        SaveCalculatedData(...);
        scopeNested.Complete()
    }
    DoRequestToExternalService(...);        
}

我已经实现了,试图使用,但似乎嵌套事务只有在外部事务也提交的情况下才会提交。

请建议。

如何组织交易

我不确定我是否理解正确。你能把所有的逻辑方法放在一个try-catch中吗?使用TransactionScopeOption,每个调用都是一个单独的事务。RequiresNew

void DoLogic1(...)
{
    try
    {
        CalculateSomeData(...);
        SaveCalculatedData(...);
        DoRequestToExternalService(...);
    }
    catch(Exception ex)
    {
        LogException(...)
        throw;
    }
}

但是我想在外面传递错误作为一个异常(要被记录等)。

可以使用throw吗?

我决定改变我的'ExecuteWorker'方法来有条件地创建事务。因此,我能够在'DoLogicX'方法本身中创建事务。