zoukankan      html  css  js  c++  java
  • 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处理继承

  • 相关阅读:
    记录两种获取配置文件的方法
    jsp-自定义标签
    转载 -jsp静态包含和动态包含的区别
    Linux基础知识笔记
    关于HTTP协议
    关于orcale创建type的一些小经验(遇到的坑)
    servlet处理乱码之post和get
    发布restful类型的接口
    ros2 dashing 安装失败指南
    exit回调
  • 原文地址:https://www.cnblogs.com/wlflovenet/p/EFandMvc8.html
Copyright © 2011-2022 走看看