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操作