use*_*834 5 c# concurrency asynchronous asp.net-web-api2
我有一个WebApi异步控制器方法,该方法调用另一个异步方法,该方法首先进行空检查以查看记录是否存在,以及是否不将其添加到数据库中。问题是,如果我说同时有3个请求同时在各个线程中发生所有空检查(我假设),我将获得2个重复的条目。例如:
public async void DoSomething()
{
var record = {query that returns record or null}
if (record == null)
{
AddNewRecordToDatabase();
}
}
Run Code Online (Sandbox Code Playgroud)
...这似乎是一件很普通的事情,也许我缺少了一些东西,但是如何防止这种情况发生呢?当然,我必须故意使它创建重复项,但是不允许这样做。
提前致谢,
背风处
我通过调用存储过程来防止异步调用发生这种情况。然后,存储过程通过“重复键检测”或类似的 MSSQL 数据库查询进行检查。
这样,只需异步调用的顺序即可确定哪个是创建,哪个不是。