1

我正在编写一个概念证明,其中有一个简单的要求,我加载一个帐户,进行 Web 服务调用以启动付款,如果成功则更新帐户余额。

以下代码的目的是确保在 Web 服务调用成功从客户的银行中取款但由于并发问题而无法保存帐户的情况下完成一些逆转。但是,我有一个奇怪的问题,即使响应成功,catch 块中的 if 测试返回 false 并重新抛出异常?

编辑开始:

如果response.IsSuccessfultrue并且ConcurrencyException发生accountService.Save(account)在行,不currentStatus应该等于WEBSERVICE_SUCCESSFUL吗?

编辑结束:

这是一个 Web 应用程序,对Process()的调用由前端触发。我错过了什么明显的东西吗?任何帮助将非常感激。

function void Process(Account account, string param1, decimal param2) {
    string currentStatus = "START";
    try
    {
        log("Begin web service call"); 
        var response = webservice.Call(param, param2);
        log("End web service call");

        if(response.IsSuccessful)
        {
           currentStatus = "WEBSERVICE_SUCCESSFUL";
             //update account balance 
             accountService.Save(account);
        }
        else
           {
            // do something else
           }
    }
    catch (ConcurrencyException ex)
    {
        log("Error concurrency..");
        if( currentStatus == "WEBSERVICE_SUCCESSFUL")
            //do reversal 
        else
           throw ex;
    }
}
4

3 回答 3

1

本质上,您正在寻找一个Transaction。您应该查看专门为此类问题设计的System.Transactions()命名空间。

例如,当您的服务器在付款和更新余额之间的确切时间点崩溃时,会发生什么情况?

使用TransactionScope类不仅可以让您自己抽象处理事务,而且它会自动升级为由MSDTC(如果可用)管理,这将处理诸如此类的服务器崩溃。

下面的所有内容(例如异常)也将自动回滚事务。

查看编写事务应用程序以获取更多详细信息。

于 2012-07-10T20:00:02.220 回答
0

除了 Ta Quans 的回答 - 可能值得同时捕获两个级别的异常,因为您的异常处理程序似乎特定于并发问题:

例如

    try 
    { 
       some code....
    }
    catch (ConcurrencyException ex) 
    { 
        log("Error concurrency.."); 
        if( currentStatus == "WEBSERVICE_SUCCESSFUL") 
            //do reversal  
        else 
           throw; 
    } 
    catch (Exception ex) 
    {
        log("Some other error: " + ex.Message);

        if( currentStatus == "WEBSERVICE_SUCCESSFUL") 
            //do reversal  
        else 
           throw; 
    }
于 2012-07-10T09:15:56.483 回答
0

accountService.Save(account)函数可能会抛出另一个异常,catch 块没有捕获它们。在这种情况下,尝试替换ConcurrencyExceptionException

于 2012-07-10T08:42:03.630 回答