2011-04-20 61 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