EntityFramework 学习 一 并发

EntityFramework默认支持乐观并发

乐观并发中,实体加载后如果都没发生变化,ef保存该实体

首先,我们需要一个rowversion列为了控制student实体的并发问题,rowversion的数据类型为字节数组,rowversion像是自增id,

rowversion的值在数据库当中自动添加和更新

ef将在where子句中添加rowversion列,当你进行更新操作,如果rowversion的值与where子句中的值不一致,则抛出异常

Student student1WithUser1 = null;
Student student1WithUser2 = null;

//User 1 gets student
using (var context = new SchoolDBEntities())
{
    context.Configuration.ProxyCreationEnabled = false;
    student1WithUser1 = context.Students.Where(s => s.StudentID == 1).Single();
}
//User 2 also get the same student
using (var context = new SchoolDBEntities())
{
    context.Configuration.ProxyCreationEnabled = false;
    student1WithUser2 = context.Students.Where(s => s.StudentID == 1).Single();
}
//User 1 updates Student name
student1WithUser1.StudentName = "Edited from user1";

//User 2 updates Student name
student1WithUser2.StudentName = "Edited from user2";
//User 1 saves changes first
using (var context = new SchoolDBEntities())
{
    try
    {
        context.Entry(student1WithUser1).State = EntityState.Modified;
        context.SaveChanges();
    }
    catch (DbUpdateConcurrencyException ex)
    {
        Console.WriteLine("Optimistic Concurrency exception occured");
    }
}

//User 2 saves changes after User 1.
//User 2 will get concurrency exection
//because CreateOrModifiedDate is different in the database
using (var context = new SchoolDBEntities())
{
    try
    {
        context.Entry(student1WithUser2).State = EntityState.Modified;
        context.SaveChanges();
    }
    catch (DbUpdateConcurrencyException ex)
    {
        Console.WriteLine("Optimistic Concurrency exception occured");
    }
}
时间: 2024-08-24 10:09:18

EntityFramework 学习 一 并发的相关文章

EntityFramework 学习第一天

文章是作为初学者记录之用,没有学习过的同学可以借鉴一下,至于用过和高手嘛,就算了吧.仅是入门.废话不多说了,马上新建个项目,添加Entity Framework,这个词以下将用EF代替. 本文使用的IDE为vs2012.我是新建了一个控制台项目,然后添加的EF,以后我会使用EF作为类库添加到项目中,但这次仅作了解. 选择Ado.net实体数据模型,文件名随便,我在这里选择了默认名称Model1.edmx, 在弹出的对话框中选择从数据库生成,这里有个名称叫做dbfirst,就是说数据库先存在,然后

如何才能够系统地学习Java并发技术?

Java并发编程一直是Java程序员必须懂但又是很难懂的技术内容. 这里不仅仅是指使用简单的多线程编程,或者使用juc的某个类.当然这些都是并发编程的基本知识,除了使用这些工具以外,Java并发编程中涉及到的技术原理十分丰富.为了更好地把并发知识形成一个体系,也鉴于本人目前也没有能力写出这类文章,于是参考几位并发编程方面专家的博客和书籍,做一个简单的整理. 首先说一下我学习Java并发编程的一些方法吧.大概分为这几步: 1.先学会最基础的Java多线程编程,Thread类的使用,线程通信的一些方

EntityFramework Core解决并发详解

话题(EntityFramework Core并发) 对于并发问题这个话题相信大家并不陌生,当数据量比较大时这个时候我们就需要考虑并发,对于并发涉及到的内容也比较多,在EF Core中我们将并发分为几个小节来陈述,让大家看起来也不太累,也容易接受,我们由浅入深.首先我们看下给出的Blog实体类.     public class Blog : IEntityBase     {        public int Id { get; set; }        public string Nam

{objccn.io}学习笔记-并发编程-底层并发API

1.不要在GCD中干『持久』的事 GCD 通过创建所谓的线程池来大致匹配 CPU 内核数量.要记住,线程的创建并不是无代价的.每个线程都需要占用内存和内核资源.这里也有一个问题:如果你提交了一个 block 给 GCD,但是这段代码阻塞了这个线程,那么这个线程在这段时间内就不能用来完成其他工作——它被阻塞了.为了确保功能点在队列上一直是执行的,GCD 不得不创建一个新的线程,并把它添加到线程池. 如果你的代码阻塞了许多线程,这会带来很大的问题.首先,线程消耗资源,此外,创建线程会变得代价高昂.创

数据库学习 - 大规模并发优化学习笔记

大规模并发 优化服务器配置 使用负载均衡 数据库结构设计 中间件优化 数据缓存使用 数据库高并发 数据库并发策略 数据库设计建议 表设计的具体问题 查询优化 注意事项 算法优化 大规模并发 当网站有很多人访问的时候,并发量增大,这个时候我们所设计的网站就会遇到挑战.很多本来是没有问题的设计,这个时候可能就会暴露出问题了. 就像宏观物理定理不适合微观一样. 下面是一些优化的建议方法. 优化服务器配置 这个是在硬件上提升服务器,因为任何软件上的优化都是有瓶颈和极限的,所以提高服务器数量和配置是比较简

EntityFramework学习

本文档主要介绍.NET开发中两项新技术,.NET平台语言中的语言集成查询技术 - LINQ,与ADO.NET中新增的数据访问层设计技术ADO.NET Entity Framework.ADO.NET的LINQ to Entity部分以LINQ为基础,为了完整性首先介绍LINQ技术. 预备知识 LINQ技术 LINQ是.NET 3.5中新增的一种技术,这个技术扩展了.NET平台上的编程语言,使其可以更加方便的进行数据查询,单纯的LINQ技术主要完成对集合对象(如System.Collection下

Java学习笔记--并发工具Semaphore,CountDownLatch,CyclicBarrier,Exchanger

Semaphore 实现典型的信号量 CountDownLatch 在指定数量的事件发生前一直等待 CyclicBarrier 使一组线程在一个预定义的执行点等待 Exchanger 交换两个线程的数据 1. Semaphore 信号量(Semaphore),是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确.合理的使用公共资源 在java中,还可以设置该信号量是否采用公平模式,如果以公平方式执行,则线程将会按到达的顺序(FIFO)执行,如果是非公平,则可以后请求的有可能

EntityFramework 学习 一 DbContext

上一节中EDM自动生成SchoolEntities类,该类继承DbContext EntityFramework4.1之前的版本,EDM生成的类继承ObjectContext,使用ObjectContext稍微有点棘手,DbContext概念上与ObjectContext相似,它是ObjectContext的封装,DbContext是EF重要的组成部分,它是领域或实体类和数据库的桥梁 DbContext是主要的类负责数据和对象互相转化 EntitySet:  DbContext包含实体集合(DB

EntityFramework 学习 一 Persistence in Entity Framework

实体框架的持久化 当用EntityFramework持久化一个对象时,有两种情形:连接的和断开的 1.连接场景:使用同一个context上下文从数据库中查询和持久化实体时,查询和持久化实体期间,context不会被销毁 2.断开场景:实体的查询和保存提交使用不同的context上下文 上图所示,context1查询数据库中的实体然后被销毁,当实体变化时,应用程序使用context2来提交 这种情形是复杂的,因为新的context上下文不知道实体的变化,所以你不得不通知上下文. CRUD Oper