如何处理方法的一部分一次请求一次在ASPCORE中



我必须增加数据库中的列,例如用户,我使用jmeter同时发送几个请求,我尝试使用,我尝试使用锁但不正常,我该如何冻结方法?

public override DepositoProduto Save(DepositoProduto entity)
    {
        lock (entity)
        {
            using (var transaction = Session.BeginTransaction())
            {
                //here auto increment
                entity.Codigo = All().OrderByDescending(x => x.Codigo).Select(x => x.Codigo).First() + 1;
                //here commit to the database
                transaction.Commit();
            }
        }
        return entity;
    }

您需要在单顿式或静态对象上使用SemaphoreSlim。那可能是您的存储库或任何内容,或者如果您需要将其保留在请求范围内,那么您可以使用替代的助手类简单地处理此增量过程。信号量相当直接使用;您基本上只是将静态IVAR设置为 SemaphoreSlim

private static SemaphoreSlim _semaphore = new SemaphoreSlim(1);

在这里,1指定只有一件事可以一次输入信号量,这是您想要的特定情况。您可以在不同的情况下使用其他数字来基本上对限制。然后,您将需要运行的代码包装:

_semaphore.Wait(); // or await _semaphore.WaitAsync()
// code protected by semaphore here
_semaphore.Release();

信号量有一个计数器。当调用Wait时,信号量将计数器以1向上,然后如果没有其他等待,它将返回并允许后续代码处理。如果计数器已经高于最大值(这里是1个),则直到计数器降低到最大阈值以下之前,它将不会返回。减少通过Release发生,这是在代码完成后调用的。从本质上讲,这会创建一种队列,而其他线程则在等待其运行信号量保护的代码的机会。然后,您可以确保一次只有一个Save打电话做任何事情,因此,您的增量交易将始终可用。

它类似于锁定,尤其是计数为1,但是信号量是线程安全的,而锁不是。如果其他问题已经有锁,那么您只会得到一个例外,试图创建锁,您必须通过实现等待和重试的模式,断路器等手动恢复。任何特定的线程。

最新更新