我有一个处理事务的 WCF 服务。它首先根据数据库中的最后一个引用号+1生成一个引用号,然后将引用号辅助到它收到的wcf请求消息中,然后将请求中的所有信息保存到数据库中。
我遇到了一个生成重复参考号的问题,这是一种典型的竞争条件。
我实现了以下代码,以确保只有一个请求可以生成新的参考号并将其保存到数据库中。
我是否可以保证一次只有一个请求能够执行互斥锁中的代码块?
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;
}