我通过'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(...) { CalculateSomeData(...); SaveCalculatedData(...);
try
{
DoRequestToExternalService(...);
}
catch(Exception exc)
{
LogError(...);
}
}
缺少这种方法是我隐藏了调用者的异常。但我想将错误传递给外部作为例外(要记录等)。
以下是我的愿景:
void DoLogic12(...)
{
using (TransactionScope scopeNested = new TransactionScope(TransactionScopeOption.Suppress))
{
CalculateSomeData(...);
SaveCalculatedData(...);
scopeNested.Complete()
}
DoRequestToExternalService(...);
}
我已经实现了,试图使用,但似乎只有在提交外部的情况下才会提交嵌套的transcation。
请告知。
答案 0 :(得分:1)
我不确定我是否理解正确。你能把所有的逻辑方法都放在一个try-catch中吗?每次通话都是使用 TransactionScopeOption.RequiresNew
的单独交易void DoLogic1(...)
{
try
{
CalculateSomeData(...);
SaveCalculatedData(...);
DoRequestToExternalService(...);
}
catch(Exception ex)
{
LogException(...)
throw;
}
}
但我想在外面传递错误 作为例外(要记录等)。
您可以使用抛出吗?
答案 1 :(得分:0)
我决定更改我的'ExecuteWorker'方法以有条件地创建事务。因此,我可以在'DoLogicX'方法中创建事务。