MVC3+EF4.1学习系列(七)-----EF并发的处理

看这篇文章之前 推荐园子里的 这个文章已经有介绍了 而且写的很好~~ 可以先看下他的 再看我的

并发

1.悲观并发

简单的说 就是一个用户访问一条数据时 则把这个数据变为只读属性  把该数据变为独占 只有该用户释放了这条数据 其他用户才能修改 这期间如果该用户上个厕所 出去玩一圈 没有退出 则其他人都要等很久 很显然 这不是我们期望的效果  也不是这篇文章讨论的重点

2.乐观并发

乐观并发相对悲观并发,用户读取数据时不锁定数据。当一个用户更新数据时,系统将进行检查,查看该用户读取数据后其他用户是否又更改了该数据。如果其他用户更新了数据,将产生一个错误。这也是这篇文章主要讲的。

如何让EF实现乐观并发呢 其实很简单 只用简单三部就可以打造乐观并发了~

以院系类为例子

第一步 . 给实体类添加 一个时间戳

  [Timestamp]  public Byte[] Timestamp { get; set; }

第二步,在我们的院系编辑视图里 加上

@Html.HiddenFor(model => model.Timestamp)

也就是说 在读取的时候 把这个时间戳读取出来

第三步,捕获并发异常给用户一个友好的提示

        [HttpPost]        public ActionResult Edit(Department department)        {            try            {

if (ModelState.IsValid)                {                    db.Entry(department).State = EntityState.Modified;                    db.SaveChanges();                    return RedirectToAction("Index");                }            }            catch (DbUpdateConcurrencyException ex)            {                    ModelState.AddModelError(string.Empty, "友好的提示");            }         }

好了 这时可以如果有 如下情况  一个用户打开编辑院系  另一个也打开了编辑院系  当一个提交后  另一个再提交 则会提示出  友好的提示 告诉他 数据已经变更了~~

3.思考

并发管理 虽然实现了 EF帮我做了 但是我们不应该只局限与实现  要去想想中间给了我们哪些启发

打开SQL监控  开开更新时  EF帮我们做了哪些操作

exec sp_executesql N‘update [dbo].[Department]set [Name] = @0, [Budget] = @1, [StartDate] = @2, [InstructorID] = @3where (([DepartmentID] = @4) and ([Timestamp] = @5))select [Timestamp]from [dbo].[Department]where @@ROWCOUNT > 0 and [DepartmentID] = @4‘,N‘@0 nvarchar(50),@1 decimal(19,4),@2 datetime,@3 int,@4 int,@5 binary(8)‘,@0=N‘WLF‘,@1=10000.0000,@2=‘09  1 2007 12:00:00:000AM‘,@3=3,@4=3,@5=0x00000000000007D9

我们看到 更新后 查询Timestamp

于是 个人猜想 不见得对  过程应该是这样的

用户读取 这条数据时  读取到他的 Timestamp   然后更新时  检测则个和上次是否一样 不一样 说明有人刚才更新过了  这个方法 我们在用ado.net时  同样可以用到~~

细心的朋友会发现 上面的SQL语句更新时 并没有更新 Timestamp 啊

这里再说下这个  timestamp

每个数据库都有一个计数器,当对数据库中包含 timestamp 列的表执行插入或更新操作时,该计数器值就会增加。 该计数器是数据库时间戳。 这可以跟踪数据库内的相对时间,而不是时钟相关联的实际时间。 一个表只能有一个timestamp 列。 每次修改或插入包含 timestamp 列的行时,就会在 timestamp 列中插入增量数据库时间戳值。

详见 MSDN------原文

总结

学习应该多去思想 了解原理 才能破而后立 ~~

下一节 EF处理继承

时间: 2024-11-21 02:02:06

MVC3+EF4.1学习系列(七)-----EF并发的处理的相关文章

MVC3+EF4.1学习系列(五)----- EF查找导航属性的几种方式

通过上一篇的学习 我们把demo的各种关系终于搭建里起来 以及处理好了如何映射到数据库等问题 但是 只是搭建好了关系 问题还远没有解决 这篇就来写如何查找导航属性 和查找导航属性的几种方式 已经跟踪生成的SQL来检测是否满意 通过这节学习 来明白什么时候用哪个~~ 一.三种加载 1.延迟加载 这是原文中的图 大家可以去看下  我模仿上面的做了个测试  出现了  已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭. 我的解决办法是    var departments

MVC3+EF4.1学习系列(十)----MVC+EF处理树形结构

通过前几篇文章 我们处理了 一对一, 一对多,多对多关系 很好的发挥了ORM框架的做用 但是 少说了一种 树形结构的处理, 而这种树形关系 我们也经常遇到,常见的N级类别的处理, 以及经常有数据与类别挂钩.今天主要写下EF处理树形结构以及 MVC如何展示树形结构. 前面几篇的例子 一直用的是一个例子,内容是连贯的.这篇是完全单独的~ 先来说下工作中会遇到的常见场景 针对这几个场景来处理~ 1.类别 a.类别可以有无限级别 b.类别的最末端 不确定是第几级 某个节点 可以到二级 其他的节点 有可能

MVC3+EF4.1学习系列(二)-------基础的增删改查和持久对象的生命周期变化

上篇文章中 我们已经创建了EF4.1基于code first的例子  有了数据库 并初始化了一些数据  今天这里写基础的增删改查和持久对象的生命周期变化 学习下原文先把运行好的原图贴来上~~ 一.创建详细页 首先 我们先在控制器下 添加详细页的方法 因为这篇文章后面要介绍持久对象声明周期的变化 所以在这里先看下有哪些状态 EF里一共有这五中生命状态类型 其实 看名字我们可以大概猜测出个一二三来~~  游离的 未改变的  新添加的  已删除的 修改的  但是是怎么变化的能 我们在后面的代码中实践与

MVC3+EF4.1学习系列(一)-------创建EF4.1 code first的第一个实例

基于EF4.1 code first 简单的CRUD  园子中已经有很多了 ~~ 真不想再写这个了 可是为了做一个完整的小demo 从开始 到后面的一些简单重构 还是决定认真把这个写出来 争取写些别人没写到的东西~~ 好了 开始~~ 这次要做的是个学校管理的demo(通俗些) 先建一个MVC3的应用程序  因为我们是code first 所以 开始创建实体类 一.创建Model 学生和学生成绩登记表是一对多的关系  一个学生可以有多次登记 (因为有多个课程)  一个课程也可以有多个登记   可以

MVC3+EF4.1学习系列(十一)----EF4.1常见的问题解决

博客写了10篇了~有很多朋友私信问了一些问题,而且很多问题 大家问的都一样 这里说说这些常见问题的解决办法.如果大家有更好的解决办法~也希望分享出来 问题大概为这几个 一.ef4.1 codeFirst 修改表结构 增加字段等 EF code first需要重新生成库导致数据丢失的问题. 二.ef4.1 没有了edmx等复杂的东西 变得简单 干净  但如何使用存储过程,存储过程可以返回表 可以返回数值 也有可能是执行修改 删除 增加等  该怎么做? 三.ef4.1 如何使用数据库视图?每个视图都

MVC3+EF4.1学习系列(九)-----EF4.1其他的一些技巧的使用

上节通过一系列重构 简单的项目就实现了 不过还有些EF的功能没有讲 这节就通过项目 讲讲EF其他的功能与技巧 一.直接执行SQL语句 通常来讲 EF 不用写SQL语句的  但是 在有些场合  比如对生成的SQL语句 觉得不满意 要做优化  或者做报表统计时 要写很变态的SQL语句 再或者 批量操作等   这个时候 使用ORM的弱点就显露了出来 但是 做为优秀的ORM框架  EF 是支持原生态的SQL的   这里面 提供了三种方法 1. DbSet.SqlQuery   有跟踪状态的查询  2. 

MVC3+EF4.1学习系列(八)-----利用Repository and Unit of Work重构项目

项目最基础的东西已经结束了,但是现在我们的项目还不健全  不利于测试 重复性代码多   层与层之间耦合性高  不利于扩展等问题.今天的这章 主要就是解决这些问题的.再解决这些问题时,自己也产生了很多疑问,理解的也并不是很透彻 ,希望我的疑问能在这里得到解答~~ 一.模式介绍 1.Repository 在<企业架构模式>中,通过用来访问领域对象的一个类似集合的接口,在领域与数据映射层之间进行协调.还有请大家参考这个  P OF EAA详细介绍 然后说下我对这个的感觉和疑问   怎么都觉得这个Re

Scala 学习 (七) 并发编程模型Akka

一,Akka简介 二,Akka中的Actor模型 三,Akka实战案例之HelloActor 四,Akka实战案例之PingPong 五,案例基于 Actor 的聊天模型 正文 一,Akka简介 写并发程序很难.程序员不得不处理线程.锁和竞态条件等等,这个过程很容易出错,而且会导致程序代码难以阅读.测试和维护.Akka 是 JVM 平台上构建高并发.分布式和容错应用的工具包和运行时.Akka 用 Scala 语言写成,同时提供了 Scala 和 JAVA 的开发接口 二,Akka中的Actor模

Entity Framework 学习系列(4) - EF 增删改

目录 写在前面 一.开发环境 二.创建项目 三.新增 1.单表新增 2.批量新增 3.多表新增 四.编辑 1.先查询,后编辑 2.创建实体,后编辑 五.删除 写在前面 在上一小节中,学习了如何 通过Code First + MySql 的方式实现数据的迁移. 这一下节中,总结 EF的增删改. 一.开发环境 开发工具:Visual Studio 2019 开发环境:Win 10 家庭版 数据库:MySQL 8.0.17 二.创建项目 1.打开Visual Studio 2019 新建->创建程序台