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] = @3
where (([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处理继承

posted on 2011-08-02 08:44  wlf  阅读(14605)  评论(12编辑  收藏  举报