我已经通过“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:
void DoLogic11(...) { 计算一些数据(...); 保存计算数据(...);
try { DoRequestToExternalService(...); } catch(Exception exc) { LogError(...); }
这种方法的不足之处在于我对调用者隐藏了异常。但我想将错误作为异常传递到外部(记录等)。
- 使用“嵌套事务”,但我不确定它是如何工作的。
这是我的愿景:
void DoLogic12(...)
{
using (TransactionScope scopeNested = new TransactionScope(TransactionScopeOption.Suppress))
{
CalculateSomeData(...);
SaveCalculatedData(...);
scopeNested.Complete()
}
DoRequestToExternalService(...);
}
我已经实现了它,并尝试使用它,但似乎只有在外部也被提交的情况下才提交嵌套事务。
请指教。
最佳答案
我不确定我是否理解正确。你能把你所有的逻辑方法放在一个 try-catch 中吗?每个调用都是使用 TransactionScopeOption.RequiresNew
的单独事务void DoLogic1(...)
{
try
{
CalculateSomeData(...);
SaveCalculatedData(...);
DoRequestToExternalService(...);
}
catch(Exception ex)
{
LogException(...)
throw;
}
}
But I would like to pass error outside as an exception (to be logged, etc).
你能用throw吗?
关于c# - 如何组织交易?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5733685/