ASP.NET Web API C#并发请求导致数据库中出现重复如何解决?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (3)
  • 关注 (0)
  • 查看 (968)

我有一个WebApi异步控制器方法,它调用另一个异步方法,首先执行空检查以查看记录是否存在,以及是否不将它添加到数据库。问题是,如果我有3个请求同时进入所有空检查同时发生在各种线程(我假设),我会得到2重复的条目。例如:

 public async void DoSomething()
{
    var record = {query that returns record or null}
    if (record == null)
    {
        AddNewRecordToDatabase();
    }   
}

...这似乎是一件非常普通的事情,也许我错过了一些东西,但是如何防止这种情况发生?

提问于
用户回答回答于
用户回答回答于

我会通过在数据层中加入独特的约束来解决这个问题。假设你的数据源是sql,你可以通过“查询返回记录或null”在你查询的列上设置一个唯一的约束,并且它会阻止这些重复。使用锁或互斥锁的问题在于,它不能在多个服务实例间扩展。你应该能够部署你的服务的很多实例(对不同的机器),让这些实例中的任何一个处理请求,并且仍然有一致的行为。在这种情况下,互斥或锁定不会保护你免受并发问题的困扰。

用户回答回答于

我通过调用存储过程来防止异步调用发生这种情况。存储过程然后通过“重复键检测”或MSSQL数据库的类似查询来进行检查。

这样,它只是异步调用的顺序,以确定哪个是创建,哪个不是。

扫码关注云+社区

领取腾讯云代金券