EF在MySQL中对记录的乐观并发控制(原创)
乐观并发:同上面的例子,A,B两个用户同时登录,如果A先进入修改紧跟着B也进入了。A修改文档的同时B也在修改。如果在A保存之后B再保存他的修改,此时系统检测到数据库中文档记录与B刚进入时不一致,B保存时会抛出异常,修改失败。
EF支持数据库的并发控制,而在MySQL中要实现并发控制,可以根据下面步骤设置:
1、在表中增加字段RowVersion,并设置类型为timestamp(MYSQL和MSSQL都有这个类型)
2、在edmx中找到相关表的RowVersion右键选择“properties”,然后在右侧的属性面板中设置Concurrency Mode为Fixed如图:
接下来,新建一个控制台项目进行乐观并发控制的测试:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Data.Entity.Infrastructure; using Data; namespace ConcurrencyTest { class Program { static void Main(string[] args) { var user = new user { ID = Guid.NewGuid().ToString(), Name = "Merry", Age = 20, RowVersion = DateTime.Now }; //新增一条记录,保存到数据库中 using (var ctx = new TestEntities()) { ctx.user.Add(user); ctx.SaveChanges(); } //取第一条记录,并修改一个字段:这里是修改了Name var ctx1 = new TestEntities(); var user1 = ctx1.user.FirstOrDefault(); user1.Name = "Jerry"; //再创建一个Context,同样取第一条,修改Name字段并保存 var ctx2 = new TestEntities(); var user2 = ctx2.user.FirstOrDefault(); user2.Name = "Merry"; ctx2.SaveChanges(); try { ctx1.SaveChanges(); Console.WriteLine("保存成功"); } catch (DbUpdateConcurrencyException ex) { Console.WriteLine(ex.Entries.First().Entity.GetType().Name + " 保存失败"); } Console.Read(); } } }
注意:多次测试并发时,需要修改两处user.Name的值,否则,EF在做SaveChanges,默认如果是以前的值,则不会做真正的SaveChanges操作
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?