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处理继承