c# - 如何组织交易?

标签 c# .net c#-4.0 .net-4.0 transactions

我已经通过“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 编写的。

我自己看到了两个解决方案

  1. 使用 try/catch:

    void DoLogic11(...) { 计算一些数据(...); 保存计算数据(...);

    try
    {
        DoRequestToExternalService(...);
    }
    catch(Exception exc)
    {
        LogError(...);
    }
    

这种方法的不足之处在于我对调用者隐藏了异常。但我想将错误作为异常传递到外部(记录等)。

  1. 使用“嵌套事务”,但我不确定它是如何工作的。

这是我的愿景:

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/

相关文章:

c# - 在 LINQ 中获取组的第一条记录?

c# - 使用 base 创建构造函数的快捷方式 (C# Visual Studio 2015)

.net - 使用不安全代码的含义是什么

.net - NHibernate Linq 无法调用返回 IQueryable<T> 的常规方法

c# - 解释 .Net 中的 DateTime.Now 设计

multithreading - C#.Net MVC线程中的共享变量

c# - C#中的双重类型解析错误

c# - 我是否在此文件路径上使用正则表达式?

c# - 更改主音量级别

javascript - 如何在 jQuery 日期选择器中给定周数获取开始和结束日期