EF CodeFirst(三) 并发处理
悲观并发
我们先看一下不控制并发时的场景
- //未进行并发处理
- User user = new User { UserName="shenwei" ,certID= ""};
- using (BlogContext ctx= new BlogContext())
- {
- ctx.Users.Add(user);
- ctx.SaveChanges();
- } //首先插入一条数据 并提交
- //定义两个context同时进行操作
- BlogContext firContext = new BlogContext ();
- User u1 = firContext.Users.FirstOrDefault();
- BlogContext secContext = new BlogContext ();
- User u2 = secContext.Users.FirstOrDefault();
- u2.UserName = "zhangxiaomao" ; //改变名字 并提交
- secContext.SaveChanges();
- u1.UserName = "xxxxxx" ;
- u1.certID = "" ; //另一个操作改变certid,也提交
- firContext.SaveChanges();

- public class Blog
- {
- public string ID { get; set; }
- public string BlogName { get; set; }
- public string BlogAuthor { get; set; }
- public virtual List <Post> Posts { get; set ; } //导航属性
- public BlogDetails Detail { get; set; }
- [ Timestamp]
- public byte [] version { get; set; }
- }
测试如下
- //并发模拟
- Blog b = new Blog
- {
- ID = "",
- BlogName = "Gaea",
- BlogAuthor = "shenwei",
- Detail = new BlogDetails { }
- };
- //先通过一个ctx插入数据并提交
- using(BlogContext context=new BlogContext())
- {
- context.Blogs.Add(b);
- context.SaveChanges();
- }
- //创建一个ctx取的第一条数据,修改 但是不提交
- BlogContext fircontext = new BlogContext();
- Blog firstblog = fircontext.Blogs.FirstOrDefault();
- firstblog.BlogName = "哈哈,被改掉了" ;
- //创建另一个ctx还是取第一条数据,修改并提交
- BlogContext secContext = new BlogContext();
- Blog secondBlog = secContext.Blogs.FirstOrDefault();
- secondBlog.BlogAuthor = "JasonShen";
- secContext.SaveChanges();
- //这个时候再提交第一个ctx所做的修改
- try
- {
- //这是后会发现现在的数据,已经和刚进入时发生了变化,故报错
- fircontext.SaveChanges();
- Console.WriteLine("保存成功" );
- } catch(Exception e)
- {
- Console.WriteLine("保存失败" );
- }
- Console.ReadKey();
- }




那如果捕捉到了异常,EF会怎么处理呢?使用Reload处理
Resolving optimistic concurrency exceptions with Reload
使用Reload数据作为解决乐观并发异常的策略之一,除了Reload外,还有其他几种冲突解决策略,这里只讲下常用的Reload
- try
- {
- //这是后会发现现在的数据,已经和刚进入时发生了变化,故报错
- fircontext.SaveChanges();
- Console .WriteLine("保存成功" );
- } catch (DbUpdateConcurrencyException e)
- {
- Console .WriteLine("保存失败" );
- Console .WriteLine("Reload" );
- e.Entries.Single().Reload();
- Console .WriteLine(firstblog.BlogName); //会发现 变成了初始从数据库里加载的数据值
- }
针对单个字段的并发
- public class User
- {
- [Key ,DatabaseGenerated (DatabaseGeneratedOption .Identity)]
- public Guid UserGuid { get; set; }
- public string UserName { get; set; }
- [ ConcurrencyCheck ]
- public string certID { get; set; }
- }
- //针对单个字段 标示的ConcurrencyCheck 的并发
- User user = new User { UserName = "shenwei" , certID = "" };
- using (BlogContext ctx = new BlogContext ())
- {
- ctx.Users.Add(user);
- ctx.SaveChanges();
- } //首先插入一条数据 并提交
- //定义两个context同时进行操作
- BlogContext firContext = new BlogContext ();
- User u1 = firContext.Users.FirstOrDefault();
- BlogContext secContext = new BlogContext ();
- User u2 = secContext.Users.FirstOrDefault();
- u2.certID= "" ; //改变名字 并提交
- secContext.SaveChanges();
- try
- {
- u1.certID = "" ; //另一个操作改变certid,也提交
- firContext.SaveChanges();
- } catch (Exception e)
- {
- Console .WriteLine("并发报错" );
- }
EF CodeFirst(三) 并发处理的更多相关文章
- 1.【使用EF Code-First方式和Fluent API来探讨EF中的关系】
原文链接:http://www.c-sharpcorner.com/UploadFile/3d39b4/relationship-in-entity-framework-using-code-firs ...
- [.NET领域驱动设计实战系列]专题一:前期准备之EF CodeFirst
一.前言 从去年已经接触领域驱动设计(Domain-Driven Design)了,当时就想自己搭建一个DDD框架,所以当时看了很多DDD方面的书,例如领域驱动模式与实战,领域驱动设计:软件核心复杂性 ...
- EF CodeFirst增删改查之‘CRUD’
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 本篇旨在学习EF增删改查四大操作 上一节讲述了EF ...
- EF CodeFirst 创建数据库
最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精 话说EF支持三种模式:Code First M ...
- 新年奉献MVC+EF(CodeFirst)+Easyui医药MIS系统
本人闲来无事就把以前用Asp.net做过的一个医药管理信息系统用mvc,ef ,easyui重新做了一下,业务逻辑简化了许多,旨在加深对mvc,ef(codefirst),easyui,AutoMap ...
- 新年奉献MVC+EF(CODEFIRST)+EASYUI医药MIS系统(转)
出处:http://www.cnblogs.com/chenlinzhi/p/4332628.html 本人闲来无事就把以前用Asp.net做过的一个医药管理信息系统用mvc,ef ,easyui重新 ...
- ASP.NET MVC深入浅出(被替换) 第一节: 结合EF的本地缓存属性来介绍【EF增删改操作】的几种形式 第三节: EF调用普通SQL语句的两类封装(ExecuteSqlCommand和SqlQuery ) 第四节: EF调用存储过程的通用写法和DBFirst模式子类调用的特有写法 第六节: EF高级属性(二) 之延迟加载、立即加载、显示加载(含导航属性) 第十节: EF的三种追踪
ASP.NET MVC深入浅出(被替换) 一. 谈情怀-ASP.NET体系 从事.Net开发以来,最先接触的Web开发框架是Asp.Net WebForm,该框架高度封装,为了隐藏Http的无状态 ...
- 第四节:EF Core的并发处理
1.说明 和EF版本的并发处理方案一致,需要知道乐观并发和悲观并发的区别,EF Core只支持乐观并发:监控并发的两种方案:监测单个字段和监测整条数据,DataAnnotations 和 Fluent ...
- EF CodeFirst简介、默认约定、数据库初始化策略
CodeFirst 工作流程 创建或修改领域类-->使用数据注解或者Fluent API来配置领域类-->使用自动数据库迁移技术或者基于代码的数据库迁移技术来创建数据库. CodeFirs ...
随机推荐
- C/C++掌握技能(二)
多组输入:
- cpu 亲和性 affinity
http://www.ibm.com/developerworks/cn/linux/l-affinity.html
- python with用法举例
我们知道在操作文件对象的时候可以这么写 with open('a.txt') as f: '代码块' 上述叫做上下文管理协议,即with语句,为了让一个对象兼容with语句,必须在这个对象的类中声明_ ...
- java基本语法三
1 程序流程控制 流程控制语句是用来控制程序中各语句执行顺序的语句,可以将语句组合完成能完成一定功能的小逻辑模块. 流程控制方式采用结构化程序设计中规定的三种基本流程,即: ①顺序结构: 程序从上到下 ...
- 输入两棵二叉树A,B,判断B是不是A的子结构(c++实现)
#include <iostream> #include <cstdio> #include <stdio.h> #include <string> # ...
- JavaScript -- Window-Name
-----027-Window-Name.html----- <!DOCTYPE html> <html> <head> <meta http-equiv=& ...
- 百度2015校园招聘面试题回忆录(成功拿到offer)
引言 盼望着,盼望着……今年终于轮到我找工作了,还深深记得去年跟在师兄后面各种打酱油的经历,当时觉得找工作好难啊,怎么面一个败一个,以后还能找到工作不? 不过当时的失败也是理所当然的,那时候没有做任何 ...
- mysql 主键和唯一索引的区别
主键是一种约束,唯一索引是一种索引,两者在本质上是不同的. 主键创建后一定包含一个唯一性索引,唯一性索引并不一定就是主键. 唯一性索引列允许空值,而主键列不允许为空值. 主键列在创建时,已经默认为非空 ...
- Nginx缓存配置之手动清除缓存
访问我的博客 前言 前文介绍了利用 nginx 的 nginx_ngx_cache_purge 模块来实现缓存功能,并设置了缓存时间为一天. 但是如果前端修改了页面,比如首页,由于 Nginx 缓存的 ...
- 【详解】JNI (Java Native Interface) (三)
案例三:C代码访问Java对象的实例变量 获取对象的实例变量的步骤: 1. 通过GetObjectClass()方法获得此对象的类引用 2. 通过类引用的GetFieldID()方法获得实例变量的 ...