确保 Entity Framework Core 中并行数据库更新的一致性

问题描述 投票:0回答:1

我目前正在开发一个 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 中通常如何解决?

代码正在运行,但我想知道它是否会受到竞争条件的影响。

提前致谢!

sql-server asynchronous entity-framework-core parallel-processing
1个回答
0
投票

EF 使用客户端乐观并发。请参阅处理并发冲突

EF Core 实现乐观并发,它假设并发冲突相对较少。与悲观方法(预先锁定数据然后才继续修改它)相反,乐观并发不采取锁定,但如果数据自查询以来已发生更改,则安排数据修改在保存时失败。此并发失败会报告给应用程序,应用程序可能会通过对新数据重试整个操作来进行相应的处理。

在 EF Core 中,乐观并发是通过配置 属性作为并发令牌。并发令牌已加载并且 查询实体时进行跟踪 - 就像任何其他属性一样。 然后,当执行更新或删除操作时 SaveChanges(),数据库上并发令牌的值为 与 EF Core 读取的原始值进行比较。

© www.soinside.com 2019 - 2024. All rights reserved.