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

EF Core 默认采用乐观并发控制(Optimistic Concurrency Control),不锁数据,而是在 SaveChanges 或 SaveChangesAsync 执行更新/删除时,检查关键字段是否被其他操作改过。一旦发现不一致,就抛出 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 的数据库,或业务上有意义的字段(如 LastModified、Version)。
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~