【问题标题】:How to organize transactions?如何组织交易?
【发布时间】:2011-04-20 16:38:02
【问题描述】:

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

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

        scope.Complete();
    }
}

其中一种方法与“外部”服务交互,如果交互失败,我的所有事务也会失败。结果,我没有保存所需的数据(在请求外部服务之前计算。

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

    DoRequestToExternalService(...);
}

解决该问题的最佳方法是什么?

应用程序使用 C#、.NET 4.0、MS SQL 2008 编写。

我自己看到了两种解决方案

  1. 使用 try/catch:

    无效 DoLogic11(...) { 计算一些数据(...); SaveCalculatedData(...);

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

    }

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

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

这是我的愿景:

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

    DoRequestToExternalService(...);        
}

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

请指教。

【问题讨论】:

  • 我不确定是否正确理解了您的问题...无论如何,请考虑您也可以使用 RequiresNew 标志创建事务。在这种情况下,事务立即提交,无需等待外部事务。

标签: c# .net c#-4.0 .net-4.0 transactions


【解决方案1】:

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

的单独事务
void DoLogic1(...)
{
    try
    {
        CalculateSomeData(...);
        SaveCalculatedData(...);
        DoRequestToExternalService(...);
    }
    catch(Exception ex)
    {
        LogException(...)
        throw;
    }
}

但我想将错误传递给外部 作为一个例外(被记录等)。

你能用throw吗?

【讨论】:

  • 如果我“抛出”,那么我的外部事务将失败。请参阅方法“ExecuteWorker”-如果内部发生任何异常,则不会提交事务...似乎我对外部事务范围的想法不起作用...我不需要总是创建它...
【解决方案2】:

我决定更改我的“ExecuteWorker”方法以有条件地创建事务。因此,我能够在“DoLogicX”方法本身中创建事务。

【讨论】:

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