0

トランザクションを処理する WCF サービスがあります。最初に、データベース内の最後の参照番号 + 1 に基づいて参照番号を生成し、受信した wcf 要求メッセージに参照番号を追加して、要求内のすべての情報をデータベースに保存します。

典型的な競合状態である、重複した参照番号が生成されるという問題がありました。

次のコードを実装して、1 つの要求だけが新しい参照番号を生成し、それをデータベースに保存できるようにしました。

一度に 1 つの要求のみがミューテックス内のコード ブロックを実行できることが保証されますか?

    private static Mutex waitForDBInsert = new Mutex();

    protected override PostPaymentResponse PostPayment(PostPaymentRequest request)
    {
        var response = new PostPaymentResponse();
        try
        {
            // Save to transaction and payee to database
            if (request.PaymentDetails.PaymentID == 0)
            {
                waitForDBInsert.WaitOne();

                // Generate next available transactions reference number.
                response.PaymentDetails.ReferenceNumber = GenerateReferenceNumber(null);

                // Save transaction to database before processing.
                var saveToDbResponse = SaveFXPaymentToDatabase(request, response);
                waitForDBInsert.ReleaseMutex();
            }
        }
        catch (Exception ex)
        {
            if (!waitForDBInsert.SafeWaitHandle.IsClosed)
                waitForDBInsert.ReleaseMutex();
        }

        return response;
    }
4

1 に答える 1