我必须增加数据库中的列,例如用户,我使用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,但是信号量是线程安全的,而锁不是。如果其他问题已经有锁,那么您只会得到一个例外,试图创建锁,您必须通过实现等待和重试的模式,断路器等手动恢复。任何特定的线程。