我有一个WebApi异步控制器方法,它调用另一个异步方法,该方法首先执行null检查以查看记录是否存在,如果没有将其添加到数据库中。问题是,如果我有3个请求同时进入,所有的空检查在不同的线程中同时发生(我假设),我会得到2个重复的条目。例如:
public async void DoSomething()
{
var record = {query that returns record or null}
if (record == null)
{
AddNewRecordToDatabase();
}
}
..。这似乎是一件很常见的事情,也许我遗漏了一些东西,但我如何防止这种情况发生?当然,我必须故意尝试让它创建副本,但这是一个要求,不允许它这样做。
提前谢谢你,
李
发布于 2018-05-31 01:51:48
我通过调用存储过程来防止异步调用发生这种情况。然后,存储过程通过对MSSQL数据库的"On duplicate key detection“或类似查询来进行检查。
这样,它仅仅是异步调用的顺序来决定哪个是create,哪个不是create。
发布于 2018-05-31 02:22:40
我会通过在数据层中放置唯一的约束来解决这个问题。假设您的数据源是sql,您可以使用"query that return record or null“将唯一约束放在要查询的列上,这样可以防止这些重复。使用锁或互斥的问题在于它不能跨服务的多个实例进行扩展。您应该能够部署服务的许多实例(到不同的机器),让这些实例中的任何一个处理请求,并且仍然具有一致的行为。在这种情况下,互斥或锁不能保护您免受并发问题的影响。
https://stackoverflow.com/questions/50610682
复制相似问题