带互斥锁的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;
    }

带互斥锁的WCF web方法

可以,如果它是一个全局互斥锁。在这个SO线程中发布的SingleGlobalInstance类代码是一个很好的例子:在c#中使用全局互斥锁的好模式是什么?

另外,正如已经评论的那样,您还应该强烈考虑使用自动递增的列。