全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

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

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

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

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

public class Product
{
  public int Id { get; set; }
  public string Name { get; set; }
  1771256774
  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)。

  • 用 Fluent API 标记字段为并发令牌:

modelBuilder.Entity()
  .Property(p => p.Version)
  .IsConcurrencyToken();

  • 注意:你得在每次更新前主动递增或刷新这个值(比如 entity.Version++entity.LastModified = DateTime.UtcNow
  • 否则它不会变,起不到检测作用

捕获并处理 DbUpdateConcurrencyException

异常发生后,别直接报错,要读取当前数据库真实值,再决定合并策略。

  • 遍历 ex.Entries 获取每个冲突实体
  • 调用 entry.GetDatabaseValuesAsync() 拿到最新数据库快照
  • 对比 OriginalValues(你加载时的值)、CurrentValues(你修改后的值)、DatabaseValues(别人刚写入的值)
  • 常见策略有:客户端优先(强制覆盖)、服务端优先(丢弃本次修改)、手动合并(比如只保留用户改的 Name,保留数据库的 Status)
  • 调用 entry.OriginalValues.SetValues(databaseValues) 同步原始值后,可重试 SaveChangesAsync

避免并发问题的补充建议

  • 对高竞争字段(如库存、余额),考虑结合数据库原生操作(UPDATE ... SET Stock = Stock - 1 WHERE Stock >= 1)绕过 EF 的乐观锁逻辑
  • 短事务 + 快速响应,减少“读-改-写”窗口期
  • 前端提交前可加版本号校验(比如把 RowVersion 作为隐藏字段传回),提前提示用户数据已变更
  • 悲观锁(如 SELECT ... FOR UPDATE)在 EF Core 中需手动写原生 SQL 或使用事务隔离级别,不推荐作为默认方案

基本上就这些。核心就三点:选对令牌字段、理解 WHERE 条件怎么生成、异常来了别慌——读、比、定、重试。


# mysql  # 前端  # sql  # String  # for  # select  # timestamp  # int  # class  # public  # Property  # 并发  # postgresql  # 数据库  # 令牌  # 重试  # 抛出  # 这是  # 是在  # 来了  # 遍历  # 上有  # 不支持  # 三点 


相关文章: 如何快速生成ASP一键建站模板并优化安全性?  如何用西部建站助手快速创建专业网站?  c# 在ASP.NET Core中管理和取消后台任务  如何在自有机房高效搭建专业网站?  定制建站流程步骤详解:一站式方案设计与开发指南  制作电商网页,电商供应链怎么做?  如何用PHP快速搭建CMS系统?  建站之星北京办公室:智能建站系统与小程序生成方案解析  建站之星如何配置系统实现高效建站?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  建站之星ASP如何实现CMS高效搭建与安全管理?  购物网站制作公司有哪些,哪个购物网站比较好?  如何快速搭建高效可靠的建站解决方案?  建站之星价格显示格式升级,你的预算足够吗?  娃派WAP自助建站:免费模板+移动优化,快速打造专业网站  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  如何用花生壳三步快速搭建专属网站?  建站主机无法访问?如何排查域名与服务器问题  网站制作难吗安全吗,做一个网站需要多久时间?  制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?  公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?  安云自助建站系统如何快速提升SEO排名?  制作网站怎么制作,*游戏网站怎么搭建?  电影网站制作价格表,那些提供免费电影的网站,他们是怎么盈利的?  如何快速启动建站代理加盟业务?  岳西云建站教程与模板下载_一站式快速建站系统操作指南  威客平台建站流程解析:高效搭建教程与设计优化方案  SAX解析器是什么,它与DOM在处理大型XML文件时有何不同?  网站制作公司排行榜,四大门户网站排名?  建站之星如何保障用户数据免受黑客入侵?  子杰智能建站系统|零代码开发与AI生成SEO优化指南  常州企业网站制作公司,全国继续教育网怎么登录?  Python lxml的etree和ElementTree有什么区别  免费网站制作appp,免费制作app哪个平台好?  建站之星伪静态规则如何正确配置?  如何通过免费商城建站系统源码自定义网站主题与功能?  如何高效完成独享虚拟主机建站?  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  如何选择美橙互联多站合一建站方案?  武汉网站制作费用多少,在武汉武昌,建面100平方左右的房子,想装暖气片,费用大概是多少啊?  小自动建站系统:AI智能生成+拖拽模板,多端适配一键搭建  如何使用Golang安装API文档生成工具_快速生成接口文档  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  如何通过虚拟主机空间快速建站?  最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?  移民网站制作流程,怎么看加拿大移民官网?  如何用低价快速搭建高质量网站?  如何快速搭建高效WAP手机网站吸引移动用户?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  如何选择高效可靠的多用户建站源码资源? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。