【发布时间】:2011-04-20 16:38:02
【问题描述】:
我通过“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 编写。
我自己看到了两种解决方案
-
使用 try/catch:
无效 DoLogic11(...) { 计算一些数据(...); SaveCalculatedData(...);
try { DoRequestToExternalService(...); } catch(Exception exc) { LogError(...); }}
这种方法的不足之处在于我向调用者隐藏了异常。但我想将错误作为异常传递到外部(被记录等)。
- 使用“嵌套事务”,但我不确定它是如何工作的。
这是我的愿景:
void DoLogic12(...)
{
using (TransactionScope scopeNested = new TransactionScope(TransactionScopeOption.Suppress))
{
CalculateSomeData(...);
SaveCalculatedData(...);
scopeNested.Complete()
}
DoRequestToExternalService(...);
}
我已经实现了,尝试使用,但似乎嵌套事务只在外部提交的情况下才会提交。
请指教。
【问题讨论】:
-
我不确定是否正确理解了您的问题...无论如何,请考虑您也可以使用 RequiresNew 标志创建事务。在这种情况下,事务立即提交,无需等待外部事务。
标签: c# .net c#-4.0 .net-4.0 transactions