带互斥锁的WCF web方法
本文关键字:WCF web 方法 | 更新日期: 2023-09-27 18:16:43
我有一个处理事务的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;
}
可以,如果它是一个全局互斥锁。在这个SO线程中发布的SingleGlobalInstance
类代码是一个很好的例子:在c#中使用全局互斥锁的好模式是什么?
另外,正如已经评论的那样,您还应该强烈考虑使用自动递增的列。