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