如何组织交易
本文关键字:交易 何组织 | 更新日期: 2023-09-27 17:50:36
我已经通过'Guardian'方法调用了服务,该方法为每个请求打开了TransactionScope,如果一切正常,则完成该事务:
void ExecuteWorker(...)
{
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.RequiresNew))
{
...CallLogicMethods...
scope.Complete();
}
}
其中一个方法与'External'服务交互,如果交互失败,我的所有事务也会失败。因此,我没有保存所需的数据(在请求外部服务之前已计算过)。
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(...);
}
我已经实现了,试图使用,但似乎嵌套事务只有在外部事务也提交的情况下才会提交。
请建议。
我不确定我是否理解正确。你能把所有的逻辑方法放在一个try-catch中吗?使用TransactionScopeOption,每个调用都是一个单独的事务。RequiresNew
void DoLogic1(...)
{
try
{
CalculateSomeData(...);
SaveCalculatedData(...);
DoRequestToExternalService(...);
}
catch(Exception ex)
{
LogException(...)
throw;
}
}
但是我想在外面传递错误作为一个异常(要被记录等)。
可以使用throw吗?
我决定改变我的'ExecuteWorker'方法来有条件地创建事务。因此,我能够在'DoLogicX'方法本身中创建事务。