トランザクションを処理する 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;
}