控制器异步/等待SQL数据库中的死锁

时间:2017-07-12 11:27:01

标签: c# asp.net-mvc asynchronous

我有一个控制器从多台机器接收多个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();
}

1 个答案:

答案 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();
}