我目前正在开发一个 REST API,它通过 POST 将条目插入数据库。 我现在想知道以下伪代码是否会导致竞争条件。
这是显示为伪代码的代码:
entryCandidate (passed parameter to function for new entry)
var all_entries = get_all_entries_from_database
var alreadyBooked = false
foreach currentEntry in all_entries
if (currentEntry.time == entryCandidate.time)
alreadyBooked = true
if !alreadybooked
database.add(entryCandidate)
现在我的问题:由于在步骤 1 中读取表并在步骤 2 中迭代/写入,是否可能有另一个实例向数据库插入冲突的条目,所以我最终得到两个冲突的条目?
如果这是一个问题,那么在 EF 中通常如何解决?
代码正在运行,但我想知道它是否会受到竞争条件的影响。
提前致谢!
EF 使用客户端乐观并发。请参阅处理并发冲突。
EF Core 实现乐观并发,它假设并发冲突相对较少。与悲观方法(预先锁定数据然后才继续修改它)相反,乐观并发不采取锁定,但如果数据自查询以来已发生更改,则安排数据修改在保存时失败。此并发失败会报告给应用程序,应用程序可能会通过对新数据重试整个操作来进行相应的处理。
在 EF Core 中,乐观并发是通过配置 属性作为并发令牌。并发令牌已加载并且 查询实体时进行跟踪 - 就像任何其他属性一样。 然后,当执行更新或删除操作时 SaveChanges(),数据库上并发令牌的值为 与 EF Core 读取的原始值进行比较。