netcore 并发处理

EF Core 中的冲突检测

EF Core 在检测到冲突时会引发 DbConcurrencyException 异常。 数据模型必须配置为启用冲突检测。 启用冲突检测的选项包括以下项:

  • 配置 EF Core,在 Update 或 Delete 命令的 Where 子句中包含配置为并发令牌的列的原始值。

调用 SaveChanges 时,Where 子句查找使用 ConcurrencyCheckAttribute 特性注释的所有属性的原始值。 如果在第一次读取行之后有任意并发令牌属性发生了更改,更新语句将无法查找到要更新的行。 EF Core 将其解释为并发冲突。 对于包含许多列的数据库表,此方法可能导致非常多的 Where 子句,并且可能需要大量的状态。 因此通常不建议使用此方法,并且它也不是本教程中使用的方法。

  • 数据库表中包含一个可用于确定某行更改时间的跟踪列。

在 SQL Server 数据库中,跟踪列的数据类型是 rowversion。 rowversion 值是一个序列号,该编号随着每次行的更新递增。 在 Update 或 Delete 命令中,Where 子句包含跟踪列的原始值(原始行版本号)。 如果其他用户已更改要更新的行,则 rowversion 列中的值与原始值不同。 在这种情况下,Update 或 Delete 语句会由于 Where 子句而无法找到要更新的行。 如果 Update 或 Delete 命令未影响任何行,EF Core 会引发并发异常。