EF Core如何处理并发冲突 EF Core并发控制方法

admin 百科 16
EF Core 默认采用乐观并发控制,通过时间戳(RowVersion)或普通字段作为并发令牌,在 UPDATE 的 WHERE 条件中校验,冲突时抛出 DbUpdateConcurrencyException,需捕获后读取数据库值、对比并重试。

EF Core如何处理并发冲突 EF Core并发控制方法-第1张图片-佛山资讯网

EF Core 默认采用乐观并发控制(Optimistic Concurrency Control),不锁数据,而是在 SaveChangesSaveChangesAsync 执行更新/删除时,检查关键字段是否被其他操作改过。一旦发现不一致,就抛出 DbUpdateConcurrencyException,由你决定怎么处理——不是自动覆盖,而是交还控制权。

用时间戳(RowVersion)做最稳妥的并发令牌

这是推荐做法,尤其在 SQL Server 中。数据库自动生成并维护 rowversion 字段,每次更新整行都会变,完全无需业务代码干预。

  • 实体类中加 1766362819 特性,类型为 byte[]

public class Product
{
  public int Id { get; set; }
  public string Name { get; set; }
  1766362819
  public byte[] RowVersion { get; set; }
}

  • EF Core 会自动把该字段加入 UPDATE 的 WHERE 条件,例如:
    UPDATE Products SET Name = @p0 WHERE Id = @p1 AND RowVersion = @p2
  • 若 WHERE 不匹配(说明别人已更新),影响行数为 0,触发异常

用普通字段做并发令牌(需手动维护)

适合 MySQL、PostgreSQL 等不支持 rowversion 的数据库,或业务上有意义的字段(如 LastModifiedVersion)。

标签: mysql 前端

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~