我服務,通過「衛報」的方法被調用,具有的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
自己,我看到兩個解決方案
使用try/catch語句:
void DoLogic11(...) { CalculateSomeData(...); SaveCalculatedData(...);
try { DoRequestToExternalService(...); } catch(Exception exc) { LogError(...); }
}
缺乏這種方法的是,我從主叫隱藏例外。但我想在外面傳遞錯誤作爲例外(要被記錄等)。
- 使用'嵌套transcation',但我不知道如何工作。
這裏是我的眼光應該是:
void DoLogic12(...)
{
using (TransactionScope scopeNested = new TransactionScope(TransactionScopeOption.Suppress))
{
CalculateSomeData(...);
SaveCalculatedData(...);
scopeNested.Complete()
}
DoRequestToExternalService(...);
}
,我實現了,試圖用,但似乎在外部還致力於嵌套transcation僅在情況提交。
請指教。
我不確定是否正確理解了您的問題......不管怎樣,您還可以使用RequiresNew標誌創建一個事務。在這種情況下,事務立即提交而無需等待外部事務。 – 2011-04-21 11:11:40