1

アカウントをロードし、Webサービスを呼び出して支払いを開始し、成功した場合はアカウントの残高を更新するという簡単な要件で、概念実証を作成しています。

次のコードの目的は、Webサービスの呼び出しが顧客の銀行からお金を引き出すことに成功したが、同時実行の問題のためにアカウントを保存できなかった場合に、何らかの取り消しが行われるようにすることです。ただし、応答が成功した場合でも、catchブロックのifテストがfalseを返し、例外が再スローされるという奇妙な問題がありますか?

編集開始:

response.IsSuccessfulであり、行で発生する場合、WEBSERVICE_SUCCESSFULと等しくないtrue必要ConcurrencyExceptionがありますか?accountService.Save(account)currentStatus

編集終了:

これは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

基本的にあなたはトランザクションを探しています。このような問題のために特別に設計されたSystem.Transactions()名前空間を確認する必要があります。

たとえば、支払いを受け取ってから残高を更新するまでの正確な時点でサーバーがクラッシュした場合、シナリオはどうなりますか?

TransactionScopeクラスを使用すると、トランザクションの処理を自分で抽象化するだけでなく、このようなサーバーのクラッシュを処理するMSDTC (使用可能な場合)によって管理されるように自動的にエスカレーションされます。

以下のすべて(例外など)も自動的にトランザクションをロールバックします。

詳細については、トランザクションアプリケーションの作成を参照してください。

于 2012-07-10T20:00:02.220 に答える
0

accountService.Save(account)関数は、catchブロックがそれらをキャッチしない別の例外をスローする場合があります。この場合、次のように置き換えConcurrencyExceptionてみてくださいException

于 2012-07-10T08:42:03.630 に答える
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 に答える