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 ...
随机推荐
- delphi char数组、string和Pchar的相互转换
因为要调用windows的api或者给vc++写接口,很多地方都要用到pchar,现在将char数组.string和pchar之间的相互转换都列出来,都是网上找的资料,我总结一下,先直接上代码,再讲原 ...
- LOJ#3048. 「十二省联考 2019」异或粽子(trie树+堆)
题面 传送门 题解 我们先把它给前缀异或和一下,然后就是要求前\(k\)大的\(a_i\oplus a_j\).把\(k\)乘上个\(2\),变成前\(2k\)大的\(a_i\oplus a_j\), ...
- Lua C API 遍历 table
http://timothyqiu.com/archives/lua-note-table-traversal-using-c-api/ C API 遍历 Table lua_getglobal(L, ...
- underscore.js源码研究(6)
概述 很早就想研究underscore源码了,虽然underscore.js这个库有些过时了,但是我还是想学习一下库的架构,函数式编程以及常用方法的编写这些方面的内容,又恰好没什么其它要研究的了,所以 ...
- 重识 PWA 进阶到 workbox3
看到PWA,似曾相识,但又感觉很模糊,于是乎,又重新翻阅文档,学习了一遍,顺便把相关知识学习了一下,比如service worker,workbox3. PWA 概念: 全称:Progressive ...
- Docker - Docker与Vagrant的区别
Docker Docker - HomePage Wiki - Docker Docker简介 Overview Docker 是一个开源的应用容器引擎,基于 Go 语言并遵从 Apache2.0 协 ...
- iOS开发-带Placeholder的UITextView实现
iOS中UITextField带有PlaceHolder属性,可以方便用于提示输入.但是同样可以进行文本输入的UITextView控件则没有PlaceHolder属性,还是有些不方便的,尤其是对于略带 ...
- npm包发布记录
下雪了,在家闲着,不如写一个npm 包发布.简单的 npm 包的发布网上有很多教程,我就不记录了.这里记录下,一个复杂的 npm 包发布,复杂指的构建环境复杂. 整个工程使用 rollup 来构建,其 ...
- docker启动报错iptables failed: -重建docker0网络恢复
# docker启动报错 [root@localhost mysqlconf]# docker run -d -p 8080:8080 --link zookeeper:zookeeper -e du ...
- vue教程2-02 vue防止花括号{{}}闪烁,v-text和v-html、v-cloak
vue教程2-02 vue防止花括号{{}}闪烁,v-text和v-html.v-cloak 一.v-text和v-html <span>{{msg}}</span> --& ...