2013-06-03 47 views
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; 
    } 
+0

這似乎是一種危險的模式。如果您在多臺服務器上託管WCF服務,互斥鎖將無法保護您。你有沒有考慮過將數據庫創建委託給數據庫? –

回答