我有一个控制器从多台机器接收多个POST(每分钟1000个),因为所有这些数据都没有插入SQL数据库并产生一些死锁。
如何锁定此方法以同步使用而不是同时插入一个?
我可以使用此测试控制器重现该问题:
[HttpPost]
public async Task<ActionResult> Create([Bind(Include = "Value1,Value2,Id")] Test test)
{
if (ModelState.IsValid)
{
db.Tests.Add(test);
await db.SaveChangesAsync();
}
return new EmptyResult();
}
编辑:感谢彼得的回答,这段代码就像一个魅力。没有死锁。表现良好,并没有发现缓慢。
private SemaphoreSlim _semaphore = new SemaphoreSlim(1);
[HttpPost]
public async Task<ActionResult> Create([Bind(Include = "Value1,Value2,Id")] Test test)
{
await _semaphore.WaitAsync();
if (ModelState.IsValid)
{
db.Tests.Add(test);
await db.SaveChangesAsync().ConfigureAwait(false);
}
_semaphore.Release();
db.Dispose();
return new EmptyResult();
}
答案 0 :(得分:1)
您可以使用SemaphoreSlim
来限制对数据库的访问。这个信号量可以被异步等待。
SemaphoreSlim semaphore = new SemaphoreSlim(1,1);
public async Task<ActionResult> Create([Bind(Include = "Value1,Value2,Id")] Test test)
{
await semaphore.WaitAsync().ConfigureAwait(false);
if (ModelState.IsValid)
{
db.AuditTests.Add(test);
await db.SaveChangesAsync().ConfigureAwait(false);
}
semaphore.release();
return new EmptyResult();
}