我服务,通过“卫报”的方法被调用,具有的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