如何组织交易?

时间:2011-04-20 16:38:03

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

我通过'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(...) {     CalculateSomeData(...);     SaveCalculatedData(...);

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

    }

  2. 缺少这种方法是我隐藏了调用者的异常。但我想将错误传递给外部作为例外(要记录等)。

    1. 使用'Nested transcation',但我不确定它是如何工作的。
    2. 以下是我的愿景:

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

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

      请告知。

2 个答案:

答案 0 :(得分:1)

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

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

但我想在外面传递错误   作为例外(要记录等)。

您可以使用抛出吗?

答案 1 :(得分:0)

我决定更改我的'ExecuteWorker'方法以有条件地创建事务。因此,我可以在'DoLogicX'方法中创建事务。