【发布时间】:2022-01-02 07:16:57
【问题描述】:
我有类似这样的代码:
var records = db.Records.Where(r => r.IsProcessing == false).Take(100).ToList();
records.IsProcessing = true;
await db.SaveChangesAsync()
...further work with recods
如果这段代码在一个微服务的多个实例上运行,会发生并发问题吗? (即两个服务将获得相同的记录集)。如果是,我该如何预防?
如果我的服务同时调用此方法,我想阻止我的服务从数据库中获取相同的记录。
【问题讨论】:
-
您无法阻止同时获取记录。有concurrency tokens 用于处理并发冲突。在您的情况下,您可能希望实施“先赢”策略。
-
为每个处理器分配一个唯一的 ID。首先将 NULL 的行更新为您的 id,首先使用原始 sql / 过程。然后选择它们。
标签: c# entity-framework asp.net-core entity-framework-core ef-core-3.1