我已经通过“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编写。
我自己看到两个解决方案
Using try/catch:
void DoLogic11(...) { CalculateSomeData(...); SaveCalculatedData(...);
try { DoRequestToExternalService(...); } catch(Exception exc) { LogError(...); }
}
这种方法的缺点是我将异常隐藏了,但我希望将错误作为异常传递给外部(以便记录等)。
- 使用“嵌套事务”,但我不确定它是如何工作的。
这是我的设想:
void DoLogic12(...)
{
using (TransactionScope scopeNested = new TransactionScope(TransactionScopeOption.Suppress))
{
CalculateSomeData(...);
SaveCalculatedData(...);
scopeNested.Complete()
}
DoRequestToExternalService(...);
}
我已经实现了这个功能,尝试使用了一下,但似乎只有在外部事务提交时嵌套的事务才会被提交。
请给予建议。