2013-06-03 26 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服务,互斥锁将无法保护您。你有没有考虑过将数据库创建委托给数据库? –

回答