使用 SQL Raw 查询避免 EF Core 中的并发问题

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

我有一个与 EF Core 并发处理相关的问题。

假设我们有一个具有

Person
实体的应用程序,并且它具有
balance
属性。我们有一个
add-balance
控制器端点,它获取
personId
amount
的输入来添加余额。

如果我们使用传统方式从数据库中跟踪人的实体,请设置

person.Balance = person.Balance + amount

然后用新的人员实体更新数据库,这会导致并发冲突,因为可能有其他请求同时到来。

我的问题是,如果我生成一个 SQL 原始查询来直接使用

RawSQLQuery

执行此操作
UPDATE Person SET Balance = Balance + {1} WHERE id = {2}

这会帮助我避免应用程序级别的并发问题吗?现在数据库事务处理所有值?

如果不是,确保正确更新人员余额的最佳方法是什么。

asp.net-core concurrency entity-framework-core
1个回答
0
投票

处理应用程序中的并发对于确保数据一致性至关重要,特别是当多个用户或进程可以同时修改相同的数据时。在 Entity Framework (EF) Core 中,乐观并发是首选方法。让我们探讨一下如何有效地处理并发冲突:

  1. 乐观并发: o EF Core 实现乐观并发,它假设并发冲突相对较少。 o 与预先锁定数据的悲观方法不同,乐观并发不使用锁。相反,它检查数据自查询以来是否已更改。 o 要实现乐观并发,请将属性配置为并发令牌。当查询实体时,会加载并跟踪此令牌。 o 当您在 SaveChanges() 期间执行更新或删除操作时,EF Core 会将数据库中并发令牌的值与 EF Core 读取的原始值进行比较。 o 例如,考虑将具有 Version 属性的 Person 实体作为并发令牌: o 当您修改 Person 实例并保存更改时,EF Core 确保版本保持一致。如果另一个请求修改了同一个人,则更新会失败,可以相应处理并发冲突。 2. 原始 SQL 查询: o 直接使用原始 SQL 查询(如 UPDATE 语句)会绕过 EF Core 的跟踪和并发机制。 o 虽然它可能在数据库级别工作,但它不能防止应用程序级别的并发问题。 o 数据库事务处理值的方式与 EF Core 更改跟踪的方式不同。 o 当您修改 Person 实例并保存更改时,EF Core 确保版本保持一致。如果另一个请求修改了同一个人,更新就会失败,可以相应处理并发冲突。
  2. 原始 SQL 查询: o 直接使用原始 SQL 查询(如 UPDATE 语句)会绕过 EF Core 的跟踪和并发机制。 o 虽然它可能在数据库级别工作,但它不能防止应用程序级别的并发问题。 o 数据库事务处理值的方式与 EF Core 更改跟踪的方式不同。
© www.soinside.com 2019 - 2024. All rights reserved.