2011-04-20 63 views
3

我服务,通过“卫报”的方法被调用,具有的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语句:

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

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

    }

缺乏这种方法的是,我从主叫隐藏例外。但我想在外面传递错误作为例外(要被记录等)。

  1. 使用'嵌套transcation',但我不知道如何工作。

这里是我的眼光应该是:

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

    DoRequestToExternalService(...);   
} 

,我实现了,试图用,但似乎在外部还致力于嵌套transcation仅在情况提交。

请指教。

+0

我不确定是否正确理解了您的问题......不管怎样,您还可以使用RequiresNew标志创建一个事务。在这种情况下,事务立即提交而无需等待外部事务。 – 2011-04-21 11:11:40

回答

0

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

1

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

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

但我想外 传递错误作为异常一个单独的事务(要记录的,等等)。

你能用throw

+0

如果我'抛出',那么我的外部交易将失败。请参阅方法'ExecuteWorker' - 如果内部发生任何异常,事务将不会被提交...似乎我的想法与外部事务范围不起作用...我不需要创建它总是... – Budda 2011-04-26 05:15:53