• 通过冲突检测和(发生冲突时的)事务回滚,来防止并发业务事务中的冲突.

    • 通常一个业务事务的执行,会跨越一系列的系统事务.
      • 一旦超出了单个系统事务的范围,就不能仅依靠DB管理程序来保证数据一致性.
    • 乐观离线锁
      • 假设冲突的发生可能性很小.
      • 使多用户并发地对同一份数据进行处理成为可能.
      • 在同一业务事务中,进行预验证和对数据的修改.
      • 一个成功的预验证可以视为得到一个锁,来表示能够成功地完成对数据的修改.
  • 运行机制
    • 原理:通过检查在(业务事务)会话读取一条记录后,没有其它的会话修改该记录来保证数据的一致性.
    • 可以在任何时间获取该锁,但是它只在获得该所的系统事务过程中有效.
      • 系统事务中只有有对DB的修改,就需对每个变更成员申请该锁.
    • 实现
      • 为每条记录关联一个Version.

        • 在加载记录时,由会话本身来维护版本号.
        • 获取锁的动作,就是将会话数据中的版本号与DB中记录当前的版本号进行对比.验证成功时,所有变化(包括版本号的增加)可以提交.
        • 通过增加版本号来避免不一致的记录.使用旧版本号的会话无法获得乐观离线锁.
        • 一条SQL语句就可以同时获取锁(根据会话的版本号来检索DB)和更新数据.
          • 通过检查SQL执行结果返回的行数得知是否成功.1代表成功.0代表记录被更改或删除.
          • 不成功时,要么取消业务事务,要么解决冲突并重试.
        • 除了Version,还可以附加上一下最后修改该记录的信息(Who,When).以便于冲突发生时的管理.
      • 在更新时的SQL语句中的where子句中包含对所有字段的检查.
        • 好处是不用增加版本号字段.
        • 但是造成了很长的where语句.损害性能.
      • 当事务只依赖于一个数据行的存在与否,或者仅是其中的一个字段.那么更应该使用条件判断而不是版本控制来提供灵活性.
      • 一个更简单的方式是把业务事务的所有步骤放在一个长的DB事务中.
      • 企业应用中的并发管理更是一个领域问题,而不是技术上的问题.
      • 乐观离线锁的实例:SCM
        • 当SCM检测到冲突时,会自动合并修改并重新提交.
        • 所以,配合了高效的合并策略后,乐观离线锁会更加的强大.
        • 在企业应用中,合并业务数据需要特殊的代码处理.
      • 该锁只会在最后的提交阶段时报告冲突.
        • 可以在之前的步骤中checkcurrent()来预判别人是否更改了数据.
  • 使用时机
    • 业务事务的冲突率很低时.
    • 并发管理的目标是尽可能增加对数据的并发访问,同时减少冲突.
    • 所以,应考虑的是光有乐观锁是不是还不够.需不需要补充上悲观离线锁.

Optimistic Offline Lock乐观离线锁的更多相关文章

  1. Pessimistic Offline Lock悲观离线锁

    每次只允许一个业务事务来访问数据,以防止并发业务事务中的冲突. 离线并发处理通常会出现多个业务事务操作同一数据. 最简单的办法是为整个业务事务保持一个系统事务.但是事务系统不适合于处理长事务. 首选乐 ...

  2. [转]掌握 ASP.NET 之路:自定义实体类简介 --自定义实体类和DataSet的比较

    转自: http://www.microsoft.com/china/msdn/library/webservices/asp.net/CustEntCls.mspx?mfr=true 发布日期 : ...

  3. Catalog of Patterns of Enterprise Application Architecture

    Catalog of Patterns of Enterprise Application Architecture Last Significant Update: January 2003 A s ...

  4. Coarse-Grained lock 粗粒度锁

    用一个锁Lock一组相关的对象 有时,需要按组来修改多个对象. 这样,在需要锁住其中一个的时候,必须连带地将其他的对象都上锁. 为每一个对象都加上一个锁是很繁琐的. 粗粒度锁是覆盖多个对象的单个锁. ...

  5. SQL Server 锁机制 悲观锁 乐观锁 实测解析

    先引入一些概念,直接Copy其他Blogs中的,我就不单独写了. 一.为什么会有锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 1.丢失更新 A,B两个用户读同一数据并进行修改,其中 ...

  6. Pessimistic and Optimistic locking

    事务隔离通常通过锁定任何对事务中资源的访问来实现的.总的来说,有两种方法针对事务的锁定:乐观锁(Pessimistic locking)和悲观锁(Optimistic locking) 悲观锁(Pes ...

  7. SQL SERVER锁(LOCK)知识及锁应用

    提示:这里所摘抄的关于锁的知识有的是不同sql server版本的,对应于特定版本时会有问题. 一 关于锁的基础知识 (一). 为什么要引入锁 当多个用户同时对数据库的并发操作时会带来以下数据不一致的 ...

  8. 【转】锁(lock)知识及锁应用

    sql server锁(lock)知识及锁应用转自:http://blog.csdn.net/huwei2003/article/details/4047191 关键词:锁提示,锁应用 提示:这里所摘 ...

  9. In-Memory:内存优化表的事务处理

    内存优化表(Memory-Optimized Table,简称MOT)使用乐观策略(optimistic approach)实现事务的并发控制,在读取MOT时,使用多行版本化(Multi-Row ve ...

随机推荐

  1. HDU 4941 Magical Forest 【离散化】【map】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4941 题目大意:给你10^5个点.每一个点有一个数值.点的xy坐标是0~10^9.点存在于矩阵中.然后 ...

  2. Qt Quick实现的涂鸦程序

    之前一直以为 Qt Quick 里 Canvas 才干够自绘.后来发觉不是,原来还有好几种方式都能够画图! 能够使用原始的 OpenGL(Qt Quick 使用 OpenGL 渲染).能够构造QSGN ...

  3. 使用NPOI导出DataTable到Excel

    使用C#对DataTable导出到Excel是我们工作当中比较多用到的场景,微软提供了Microsoft.Office.Interop.Excel组件可以进行操作,但是该组件在数据量大的时候速度很慢, ...

  4. C#基础-Func,Action

    Func,Action 的介绍及其用法 Func是一种委托,这是在3.5里面新增的,2.0里面我们使用委托是用Delegate,Func位于System.Core命名空间下,使用委托可以提升效率,例如 ...

  5. [Angular2 Form] Understand the Angular 2 States of Inputs: Pristine and Untouched

    Angular 2’s ngModel exposes more than just validity, it even gives you the states of whether the inp ...

  6. Qt多线程学习:创建多线程

    [为什么要用多线程?] 传统的图形用户界面应用程序都仅仅有一个运行线程,而且一次仅仅运行一个操作.假设用户从用户界面中调用一个比較耗时的操作,当该操作正在运行时,用户界面一般会冻结而不再响应.这个问题 ...

  7. Javascript禁止子元素继承父元素的事件

    3种方法1.在父元素事件的function中加if(event.target==this){ }2.子元素事件function最后加event.stopPropgation():// 阻止事件冒泡3. ...

  8. 关于解决Permission is only granted to system apps

    一句话,clean一下这个Project!就OK了…… 不要被假象迷惑!

  9. 亚马逊副总裁谈Marketplace平台的个性化服务

    说到个性化,亚马逊无疑是挖掘与利用数据为消费者打造个性化网购体验的先驱之一.而现在,几乎所有的公司和网站都在利用更加个性化的推荐算法为用户提供更好的购物和浏览体验. 亚马逊近年来尤其重视将其个性化特性 ...

  10. C# 使用代码来操作 IIS

    由于需要维护网站的时候,可以自动将所有的站点HTTP重定向到指定的静态页面上. 要操作 IIS 主要使用到的是“Microsoft.Web.Administration.dll”. 该类库不可以在引用 ...