全网整合营销服务商

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

免费咨询热线: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  # 数据库  # 令牌  # 重试  # 抛出  # 这是  # 是在  # 来了  # 遍历  # 上有  # 不支持  # 三点 


相关文章: Swift开发中switch语句值绑定模式  建站之星备案是否影响网站上线时间?  网站规划与制作是什么,电子商务网站系统规划的内容及步骤是什么?  免费制作海报的网站,哪位做平面的朋友告诉我用什么软件做海报比较好?ps还是cd还是ai这几个软件我都会些我是做网页的?  如何通过.red域名打造高辨识度品牌网站?  GML (Geography Markup Language)是什么,它如何用XML来表示地理空间信息?  实现点击下箭头变上箭头来回切换的两种方法【推荐】  如何高效搭建专业期货交易平台网站?  c# Task.Yield 的作用是什么 它和Task.Delay(1)有区别吗  建站主机解析:虚拟主机配置与服务器选择指南  建站上传速度慢?如何优化加速网站加载效率?  建站之星如何保障用户数据免受黑客入侵?  北京网站制作网页,网站升级改版需要多久?  如何在云虚拟主机上快速搭建个人网站?  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  如何选择最佳自助建站系统?快速指南解析优劣  魔方云NAT建站如何实现端口转发?  韩国服务器如何优化跨境访问实现高效连接?  Python多线程使用规范_线程安全解析【教程】  关于BootStrap modal 在IOS9中不能弹出的解决方法(IOS 9 bootstrap modal ios 9 noticework)  如何通过wdcp面板快速创建网站?  javascript中对象的定义、使用以及对象和原型链操作小结  5种Android数据存储方式汇总  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  如何通过万网虚拟主机快速搭建网站?  长沙做网站要多少钱,长沙国安网络怎么样?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  ,购物网站怎么盈利呢?  浅析上传头像示例及其注意事项  建站之星安装后如何自定义网站颜色与字体?  linux top下的 minerd 木马清除方法  MySQL查询结果复制到新表的方法(更新、插入)  b2c电商网站制作流程,b2c水平综合的电商平台?  贸易公司网站制作流程,出口贸易网站设计怎么做?  如何在IIS中新建站点并配置端口与IP地址?  如何获取开源自助建站系统免费下载链接?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  如何通过虚拟主机快速搭建个人网站?  免费视频制作网站,更新又快又好的免费电影网站?  成都网站制作报价公司,成都工业用气开户费用?  香港服务器网站测试全流程:性能评估、SEO加载与移动适配优化  微信推文制作网站有哪些,怎么做微信推文,急?  ,怎么在广州志愿者网站注册?  建站主机系统SEO优化与智能配置核心关键词操作指南  郑州企业网站制作公司,郑州招聘网站有哪些?  建站之星北京办公室:智能建站系统与小程序生成方案解析  网站企业制作流程,用什么语言做企业网站比较好?  浙江网站制作公司有哪些,浙江栢塑信息技术有限公司定制网站做的怎么样?  微信小程序制作网站有哪些,微信小程序需要做网站吗?  如何在Windows服务器上快速搭建网站? 

您的项目需求

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