0
我有一個處理事務的WCF服務。它首先根據數據庫中的最後一個參考號+ 1生成一個參考號,然後輔助參考號到它收到的wcf請求消息,然後將請求中的所有信息保存到數據庫中。帶互斥鎖的WCF Web方法
我有一個問題,其中生成重複的參考數字,這是一個典型的競爭條件。
我實現了以下代碼,以確保只有一個請求可以生成新的引用號並將其保存到數據庫。
我能保證只有一個請求能夠一次執行互斥體中的代碼塊嗎?
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;
}
這似乎是一種危險的模式。如果您在多臺服務器上託管WCF服務,互斥鎖將無法保護您。你有沒有考慮過將數據庫創建委託給數據庫? –