0

我有一个处理事务的 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;
    }
4

1 回答 1

0

是的,如果它是一个全局互斥锁。SingleGlobalInstance请参阅此 SO 线程中发布的类代码以获取一个很好的示例:在 C# 中使用全局互斥锁的好模式是什么?

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

于 2013-06-04T02:21:59.510 回答