EFCore乐观并发

在 Entity Framework Core 中,乐观并发是一种处理并发访问的方式,它允许多个用户同时访问和修改相同的数据,而不会发生冲突。乐观并发的实现通常涉及使用版本控制字段来检测数据更改,并在保存更改时检查这些字段是否与预期值匹配。

以下是在 Entity Framework Core 中实现乐观并发的一般步骤:

  1. 为实体模型添加一个用于乐观并发的版本属性。这通常是一个用于标识数据版本的属性,可以是整数、时间戳等。
public class Entity
{public int Id { get; set; }public string Name { get; set; }[Timestamp]public byte[] Version { get; set; } // 乐观并发的版本属性
}
  1. 在配置实体模型时,告诉 Entity Framework Core 使用版本属性进行乐观并发检查。
protected override void OnModelCreating(ModelBuilder modelBuilder)
{modelBuilder.Entity<Entity>().Property(e => e.Version).IsConcurrencyToken(); // 告诉 EF 使用 Version 属性进行乐观并发检查
}
  1. 当更新实体时,Entity Framework Core 会自动检查版本属性,如果版本不匹配,则会抛出 DbUpdateConcurrencyException 异常,您可以在捕获该异常后进行处理。
try
{// 查询要更新的实体var entity = context.Entities.FirstOrDefault(e => e.Id == 1);// 修改实体的其他属性context.SaveChanges(); // 更新实体时进行乐观并发检查
}
catch (DbUpdateConcurrencyException ex)
{// 处理并发异常,例如提示用户、日志记录等
}

通过使用乐观并发,Entity Framework Core 可以在并发访问和修改相同数据时提供一种有效的解决方案。

在处理并发冲突时,有时候我们可能希望采用未保存的值来解决冲突。在 Entity Framework Core 中,可以通过捕获 DbUpdateConcurrencyException 异常并采取适当的措施来实现这一点。

以下是在处理并发冲突时采用未保存的值的一般步骤:

try
{// 查询要更新的实体var entity = context.Entities.FirstOrDefault(e => e.Id == 1);// 修改实体的其他属性context.SaveChanges(); // 更新实体时进行并发检查
}
catch (DbUpdateConcurrencyException ex)
{var entry = ex.Entries.Single();var databaseValues = entry.GetDatabaseValues();var originalValues = entry.OriginalValues;// 使用未保存的值来解决并发冲突foreach (var property in originalValues.Properties){var databaseValue = databaseValues[property];var originalValue = originalValues[property];// 采用未保存的值来解决冲突entry.CurrentValues[property] = originalValue;}// 重新尝试保存context.SaveChanges();
}

在上述代码中,当捕获到 DbUpdateConcurrencyException 异常时,我们通过获取数据库中的当前值和原始值,然后使用未保存的值来解决冲突。我们遍历实体的所有属性,比较数据库值和原始值,然后将未保存的值重新应用到实体的当前值中。

通过采用未保存的值来处理并发冲突,我们可以确保在并发访问和修改相同数据时提供一种有效的解决方案,同时尽量减少冲突和数据丢失的可能性。
4.在代码中模拟并发

    // 查询要更新的实体var entity = context.Entities.FirstOrDefault(e => e.Id == 1);entity.Name="test1";//不需要savechange()就已经保存到数据库了context.DataBase.ExecuteSqlInterpolated($"update Entities set Name='test2'");context.SaveChanges();

上如代码模拟了两个并发,test2先保存到了数据库,test1执行完savechanes()后才把保存到数据库,应为test2保存到了数据库Version的版本时间戳跟新了,test1还是原来的时间戳,test1保存时和最新的时间戳比较,发现不一致,所以会进入修改并发异常。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/178136.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

顺序栈的基本操作(超详细)

目录 前言 一、顺序栈的定义 二、顺序栈的c语言结构描述表示 三、顺序栈中基本操作的实现 3.1顺序栈的初始化 3.2判断顺序栈是否为空 3.3求顺序栈的长度 3.4清空顺序栈 3.5销毁顺序栈 3.6顺序栈的入栈 3.7顺序栈的出栈 3.8求栈顶元素 3.9遍历顺序栈 四、顺序栈的…

JDK21发布了!面试官:来,谈下jdk21的新特性!

1.前言 JDK21 计划23年9月19日正式发布&#xff0c;尽管一直以来都是“版随意出&#xff0c;换 8 算我输”&#xff0c;但这么多年这么多版本的折腾&#xff0c;若是之前的 LTS 版本JDK17你还觉得不错&#xff0c;那 JDK21还是有必要关注一下&#xff0c;因为会有一批重要更新…

华清远见嵌入式学习——C++——作业一

作业要求&#xff1a; 代码&#xff1a; #include <iostream>using namespace std;int main() {string str;cout << "请输入一个字符串&#xff1a;" << endl;getline(cin,str);int dx0,xx0,sz0,kg0,qt0;int len str.size() 1;for(int i0;i<l…

HarmonyOS 传感器开发指南

HarmonyOS 系统传感器是应用访问底层硬件传感器的一种设备抽象概念。开发者根据传感器提供的Sensor接口&#xff0c;可以查询设备上的传感器&#xff0c;订阅传感器数据&#xff0c;并根据传感器数据定制相应的算法开发各类应用&#xff0c;比如指南针、运动健康、游戏等。 运作…

Centos 如何判断分区是mbr还是gpt格式

1 介绍 MBR 自20世纪80年代初以来的标准分区表格式每个驱动器最多支持四个主分区最多可以划分2TB的磁盘 GPT GPT是MBR分区表格式的后续每个驱动器最多支持128个分区可以将一个磁盘分区到最大到18艾字节 对小于2TB的磁盘使用MBR对大于2TB的磁盘使用GTP 2 查询方式 2.1 fdis…

校园虚拟化部署与横向扩展统一存储

项目背景 这所隶属教育部直属重点大学&#xff0c;学校设有11个学科体系&#xff0c;现有本硕博学生共29000余人&#xff0c;为积极响应“中国教育现代化2023战略部署”&#xff0c;校方制定教育信息化2.0发展目标&#xff0c;通过平台融合&#xff0c;数据驱动、技术赋能等措…

Linux常见指令基础知识

目录 初始Linux操作系统 Linux背景&#xff1a; 开源 &#xff1a; 发行版本&#xff1a; ​编辑 OS概念&#xff0c;定位&#xff1a; 使用 XShell 远程登录 Linux Linux相关知识 文件是什么&#xff1f; 路径分隔符 &#xff08;.&#xff09; 和 &#xff08;. .&…

Docker Swarm总结+Jenkins安装配置与集成(5/5)

博主介绍&#xff1a;Java领域优质创作者,博客之星城市赛道TOP20、专注于前端流行技术框架、Java后端技术领域、项目实战运维以及GIS地理信息领域。 &#x1f345;文末获取源码下载地址&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb;…

【HarmonyOS】ArkUI状态管理:组件内状态、装饰器、高级用法与最佳实战【鸿蒙专栏-08】

文章目录 ArkUI状态管理机制详解1. 概述2. 基本概念2.1 状态变量2.2 数据传递和同步2.3 初始化方法3. 装饰器总览3.1 管理组件拥有的状态3.2 管理应用拥有的状态3.3 其他状态管理功能4. @State装饰器详解4.1 使用规则说明4.2 传递/访问规则说明4.3 观察变化和行为表现5. 使用场…

反射、枚举以及lambda表达式

1. 反射 1.1 定义 java的.class文件在运行时会被编译为一个Class对象&#xff0c;既然是对象&#xff0c;那么我们就可以通过一定的方式取到这个对象&#xff0c;然后对于这个对象进行一系列操作&#xff08;改变原本类的属性、方法&#xff09;。 这个操作就是反射&#xf…

前端位运算

1 当一个数字被向左推了n位时&#xff0c;意味着该数字被乘以2的n次方。25 << 3 200 (25 * 2 power 3) 2 我们将一个数字向右移1位时&#xff0c;它就将该数字除以2 位运算&#xff5c; 二进制表2000010400010080010001601000032100000 他们都是只有一位为1其余位都为…

Mongodb使用killCursors停止运行的cursor

cursor指向查询结果的游标&#xff0c;通过游标向下移动&#xff0c;获得下一条查询结果。当查询效率高&#xff0c;获取查询结果仅仅需要少量的资源时&#xff0c;cursor返回结果的速度快。而查询速度慢&#xff0c;占用cpu&#xff0c;内存等资源多&#xff0c;cursor返回结果…

数据仓库建模下篇

在实际业务中&#xff0c;给了我们一堆数据&#xff0c;我们怎么拿这些数据进行数仓建设呢&#xff0c;数仓工具箱作者根据自身多年的实际业务经验&#xff0c;给我们总结了如下四步。 数仓工具箱中的维度建模四步走&#xff1a; 维度建模四步走 这四步是环环相扣&#xff0c…

高转速低成本高速吹风筒MCU应用方案

高速吹风机作为护发领域的一大强将&#xff0c;符合现代人对养发的追求&#xff0c;大家力争在头发上的每一分钱都要花在刀刃上&#xff0c;高速吹风机相比较于普通吹风筒采用的是更高的转速马达&#xff0c;马达转速越快风速越大&#xff0c;干发速度快&#xff1b;高风速吹发…

JOSEF 可调漏电继电器 RT-L1KS φ25mm 导轨或面板安装

RT-L系列可调漏电继电器&#xff08;以下简称继电器&#xff09;适用于交流电压至690V&#xff0c;频率为50Hz&#xff0c;电流至1500A及以下漏电继电器中性点接地电路中。 RT-L系列可调型漏电继电器 RT-L1K可调型漏电继电器 RT-L2K可调型漏电继电器 RT-L3K可调型漏电继电器…

Mybaits-plus的使用

MybatisPlus特性 润物无声&#xff1a; 只做增强不做改变&#xff0c;引入它不会对现有工程产生改变&#xff0c;如丝般顺滑。 效率至上 只需简单配置&#xff0c;即可快速进行单表CRUD操作&#xff0c;从而节省大量时间。 使用MybatisPlus依赖基本步骤 引入MybatisPlus依…

软件产品登记的材料条件

(1&#xff09;申请双软认证前应该要获得信息产业部授权的软件检测机构出具的检测证明&#xff0c;这份检测证明可以到软件行业协会申请&#xff0c;然后协会会派专家到公司进行“检测”&#xff0c;检测通过后出具证明&#xff0c;这份证明的申请与软件著作权等无关&#xff0…

echarts点击事件

有这么个需求要点击叶片的时候跳转页面 代码&#xff1a;点击之后 报错了 解决办法 1、使用箭头函数&#xff08;箭头函数没有自己的 this&#xff0c;所以在箭头函数中使用 this 时&#xff0c;其指向与外层作用域相同。&#xff09;或者使用闭包来解决上下文的问题。 2、使…

微信可以添加多少好友?

不知道有没有小伙伴好奇&#xff0c;微信到底可以添加多少好友&#xff1f;正好这个话题也上热搜了&#xff0c;我们就来了解一下。 有网友表示&#xff0c;自己的微信好友数量有10004个&#xff0c;已经不能再添加新的微信好友了。 一个微信号&#xff0c;可以添加的好友上限…

初识Linux(2).妈妈再也不用担心我Linux找不到门了。

文章目录 前言 1.man指令&#xff08;重要&#xff09;&#xff1a;例如&#xff1a; 2.cp指令&#xff08;重要&#xff09;&#xff1a;例如&#xff1a;把123.txt复制到a目录中类似window如下操作&#xff1a; 3.mv例如&#xff1a;类似window如下操作&#xff1a; 4.nano例…