【发布时间】:2018-05-30 17:45:50
【问题描述】:
我有一个 WebApi Async 控制器方法,它调用另一个异步方法,该方法首先执行 null 检查以查看记录是否存在,以及是否不将其添加到数据库中。问题是,如果我说 3 个请求同时进入,所有空检查同时在各个线程中发生(我假设),我将得到 2 个重复条目。例如:
public async void DoSomething()
{
var record = {query that returns record or null}
if (record == null)
{
AddNewRecordToDatabase();
}
}
...这似乎是一件很常见的事情,也许我遗漏了一些东西,但是我该如何防止这种情况发生呢?当然,我必须有意识地尝试让它创建副本,但必须不允许它这样做。
提前致谢,
李
【问题讨论】:
-
看看这个链接。它描述了如何使用 EntityFramework 实现乐观锁定机制。另一种选择是使用互斥锁。 docs.microsoft.com/en-us/aspnet/mvc/overview/getting-started/…
-
@Matt 乐观锁定是一种很好的更新方法,但我不确定它如何用于插入,因为没有记录可以检查更改。
-
OP:两个问题。 (1) 期望的行为是什么?如果两个用户一次添加相同的东西,您是否希望添加两条记录,但您只需要确保标识符是唯一的?还是您希望第二个用户看到错误? (2) 您是在使用任何类型的实体框架,还是使用直接 SQL 调用?
-
@John Wu - 同一个端点同时被同一个请求击中的不是用户。如果记录不存在,我想添加它。如果它确实存在,我只想忽略它。谢谢:)
标签: c# asynchronous concurrency asp.net-web-api2