每次只允许一个业务事务来访问数据,以防止并发业务事务中的冲突.

  • 离线并发处理通常会出现多个业务事务操作同一数据.
  • 最简单的办法是为整个业务事务保持一个系统事务.但是事务系统不适合于处理长事务.
  • 首选乐观离线锁.
  • 而悲观离线锁,作为它的补充.从一开始就避免冲突.
    • 它要求业务事务在对数据进行操作前就必须获取该数据的锁.
    • 一旦开始了一个业务事务,就确信不会再提交时由于并发冲突而被迫回滚数据.
  • 运行机制
  • 决定使用哪种锁

    • exclusive write lock独占写锁.写目的的会话数据时使用,当对数据的读取要求不高时.
    • exclusive read lock独占读锁.仅是为了读目的时的数据.限制了并发性.
    • read/write lock读/写锁.
      • 读锁和写锁互斥,同一数据记录上只能被附加上一种.
      • 允许并发的读锁.读锁会防止其他业务事务修改数据.但是允许其他业务事务读取记录.
      • 允许同时读增加了系统的并发性.但是其实现复杂.
  • 构建锁管理对象
    • 该对象负责授予或者拒绝业务事务获取/释放锁的请求.
    • 必须知晓被锁住的资源,和锁的拥有者(业务事务).
    • 只能有一张关于锁的表.该表存在于内存或者SQL语句实现的.
    • 锁必须是管理对象的私有域.业务事务只能与管理对象交互,而不能直接操作锁对象.
  • 定义业务事务使用锁管理对象的协议
    • 对什么加锁,

      • 通常仅在ID或主键加锁,因为使用它们来查找对象.
    • 何时加锁,
      • 通常在读取数据之前获取锁.保证加锁的是最新数据时采取加锁.
    • 何时释放锁,
      • 在业务事务完成时释放.
    • 当无法获得锁时的动作.
      • 可能会在业务事务一开始就因为无法获取锁而终止事务.
    • 对于相互等待对象的锁资源造成的死锁.
      • 让锁管理对象在锁不可用时抛出异常即可.直接避免死锁.
    • 丢失的会话中锁的超时.Client端在事务进行中崩溃了.
      • 让应用服务器的超时机制处理.
      • 给每个锁加上时间戳,定时清除超过一定时间的锁.
  • 使用时机
  • 适合于冲突率很高的并发会话中.
  • 也用于冲突处理代价很高时.
  • 它只能作为乐观锁的补充,不推荐使用.
  • 可以考虑使用长事务.其实现比悲观锁简单.

Pessimistic Offline Lock悲观离线锁的更多相关文章

  1. Optimistic Offline Lock乐观离线锁

    通过冲突检测和(发生冲突时的)事务回滚,来防止并发业务事务中的冲突. 通常一个业务事务的执行,会跨越一系列的系统事务. 一旦超出了单个系统事务的范围,就不能仅依靠DB管理程序来保证数据一致性. 乐观离 ...

  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. SQL-乐观锁,悲观锁之于并发

    每次写博客,第一句话都是这样的:程序员很苦逼,除了会写程序,还得会写博客!当然,希望将来的一天,某位老板看到此博客,给你的程序员职工加点薪资吧!因为程序员的世界除了苦逼就是沉默.我眼中的程序员大多都不 ...

  5. Coarse-Grained lock 粗粒度锁

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

  6. 观锁与悲观锁(Hibernate)

    乐观锁与悲观锁 文章转自网上好像是玉米田的,忘记了 锁( locking ) 业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算 处理中,我们希望针对某个 cut-off 时间 ...

  7. 不容易理解的 lock 和 merge

    Hibernate:不容易理解的 lock 和 merge 目录 背景Lock官方的注释LockMode.NONELockMode.READLockMode.UPGRADEMerge官方注释detac ...

  8. Java Hibernate中的悲观锁和乐观锁的实现

    锁(locking) 业务逻辑的实现过程中,往往需要保证数据访问的排他性.如在金融系统的日终结算 处理中,我们希望针对某个cut-off时间点的数据进行处理,而不希望在结算进行过程中 (可能是几秒种, ...

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

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

随机推荐

  1. 【多校训练2】HDU 6047 Maximum Sequence

    http://acm.hdu.edu.cn/showproblem.php?pid=6047 [题意] 给定两个长度为n的序列a和b,现在要通过一定的规则找到可行的a_n+1.....a_2n,求su ...

  2. 《大话设计模式》Python版代码实现

    上一周把<大话设计模式>看完了,对面向对象技术有了新的理解,对于一个在C下写代码比较多.偶尔会用到一些脚本语言写脚本的人来说,很是开阔眼界.<大话设计模式>的代码使用C#写成的 ...

  3. SPOJ VJudge QTREE - Query on a tree

    Query on a tree Time Limit: 851MS   Memory Limit: 1572864KB   64bit IO Format: %lld & %llu Submi ...

  4. 汕头市赛srm1X T3

    给n<=100000个点的树,每个点有一个01串,长度m<=200,串的可以随时01取反,串的每一位对应权Vi,从根节点到某个节点经过决定哪些串取反后取得的最大价值为某个点的权值,求:在这 ...

  5. SQLAlchemy的group_by和order_by的区别

    1.官网解释: group_by(*criterion) apply one or more GROUP BY criterion to the query and return the newly ...

  6. Meteor package.js

    在本章中,我们将学习如何创建自己的 meteor 包. 创建包 让我们添加在桌面上的新文件夹用来创建新的包.使用命令提示符窗口执行如下命令. C:\Users\Administrator\Deskto ...

  7. [Rust] Load a WebAssembly Function Written in Rust and Invoke it from JavaScript

    In this lesson we are going to setup a project from scratch by introducing the JavaScript snippet to ...

  8. nginx access.log 忽略favicon.ico訪问记录的方法

    favicon.ico 文件是浏览器收藏网址时显示的图标,当第一次訪问页面时.浏览器会自己主动发起请求获取页面的favicon.ico文件.当/favicon.ico文件不存在时,服务器会记录404日 ...

  9. 说说Android应用的persistent属性(转)

    1 启动persistent应用 在Android系统中,有一种永久性应用.它们对应的AndroidManifest.xml文件里,会将persistent属性设为true,比如: <appli ...

  10. 我的第一个开源控件-DragGridView

    我的第一个开源控件出炉了,希望各个小伙伴给个star,支持下.项目地址 1. 前言 因为项目须要,要做一个相似腾讯视频.频道管理.拖拽排序的效果.这个控件是在原地址 之上改造出来的.先看下效果图. 1 ...