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

EF Core 默认采用乐观并发控制(Optimistic Concurrency Control),不锁数据,而是在 SaveChanges 或 SaveChangesAsync 执行更新/删除时,检查关键字段是否被其他操作改过。一旦发现不一致,就抛出 DbUpdateConcurrencyException,由你决定怎么处理——不是自动覆盖,而是交还控制权。
这是推荐做法,尤其在 SQL Server 中。数据库自动生成并维护 rowversion 字段,每次更新整行都会变,完全无需业务代码干预。
[Timestamp] 特性,类型为 byte[]:public class Product
{
public int Id { get; set; }
public string Name { get; set; }
[Timestamp]
public byte[] RowVersion { get; set; }
}
UPDATE Products SET Name = @p0 WHERE Id = @p1 AND RowVersion = @p2
适合 MySQL、PostgreSQL 等不支持 rowversion 的数据库,或业务上有意义的字段(如 LastModified、Version)。
modelBuilder.Entity
.Property(p => p.Version)
.IsConcurrencyToken();
entity.Version++ 或 entity.LastModified = DateTime.UtcNow)异常发生后,别直接报错,要读取当前数据库真实值,再决定合并策略。
ex.Entries 获取每个冲突实体entry.GetDatabaseValuesAsync() 拿到最新数据库快照OriginalValues(你加载时的值)、CurrentValues(你修改后的值)、DatabaseValues(别人刚写入的值)entry.OriginalValues.SetValues(databaseValues) 同步原始值后,可重试 SaveChangesAsync
UPDATE ... SET Stock = Stock - 1 WHERE Stock >= 1)绕过 EF 的乐观锁逻辑RowVersion 作为隐藏字段传回),提前提示用户数据已变更SELECT ... FOR UPDATE)在 EF Core 中需手动写原生 SQL 或使用事务隔离级别,不推荐作为默认方案基本上就这些。核心就三点:选对令牌字段、理解 WHERE 条件怎么生成、异常来了别慌——读、比、定、重试。
以上就是EF Core如何处理并发冲突 EF Core并发控制方法的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号