zoukankan      html  css  js  c++  java
  • Pessimistic Offline Lock悲观离线锁

    • 每次只允许一个业务事务来访问数据,以防止并发业务事务中的冲突.
      •  
      • 离线并发处理通常会出现多个业务事务操作同一数据.
      • 最简单的办法是为整个业务事务保持一个系统事务.但是事务系统不适合于处理长事务.
      • 首选乐观离线锁.
      • 而悲观离线锁,作为它的补充.从一开始就避免冲突.
        • 它要求业务事务在对数据进行操作前就必须获取该数据的锁.
        • 一旦开始了一个业务事务,就确信不会再提交时由于并发冲突而被迫回滚数据.
    • 运行机制
      • 决定使用哪种锁
        • exclusive write lock独占写锁.写目的的会话数据时使用,当对数据的读取要求不高时.
        • exclusive read lock独占读锁.仅是为了读目的时的数据.限制了并发性.
        • read/write lock读/写锁.
          • 读锁和写锁互斥,同一数据记录上只能被附加上一种.
          • 允许并发的读锁.读锁会防止其他业务事务修改数据.但是允许其他业务事务读取记录.
          • 允许同时读增加了系统的并发性.但是其实现复杂.
      • 构建锁管理对象
        • 该对象负责授予或者拒绝业务事务获取/释放锁的请求.
        • 必须知晓被锁住的资源,和锁的拥有者(业务事务).
        • 只能有一张关于锁的表.该表存在于内存或者SQL语句实现的.
        • 锁必须是管理对象的私有域.业务事务只能与管理对象交互,而不能直接操作锁对象.
      • 定义业务事务使用锁管理对象的协议
        • 对什么加锁,
          • 通常仅在ID或主键加锁,因为使用它们来查找对象.
        • 何时加锁,
          • 通常在读取数据之前获取锁.保证加锁的是最新数据时采取加锁.
        • 何时释放锁,
          • 在业务事务完成时释放.
        • 当无法获得锁时的动作.
          • 可能会在业务事务一开始就因为无法获取锁而终止事务.
        • 对于相互等待对象的锁资源造成的死锁.
          • 让锁管理对象在锁不可用时抛出异常即可.直接避免死锁.
        • 丢失的会话中锁的超时.Client端在事务进行中崩溃了.
          • 让应用服务器的超时机制处理.
          • 给每个锁加上时间戳,定时清除超过一定时间的锁.
    • 使用时机
      • 适合于冲突率很高的并发会话中.
      • 也用于冲突处理代价很高时.
      • 它只能作为乐观锁的补充,不推荐使用.
      • 可以考虑使用长事务.其实现比悲观锁简单.
  • 相关阅读:
    MongoDB数据类型
    杭电1257
    杭电1716
    杭电1997
    杭电1492
    杭电1208
    杭电1290
    杭电1087
    杭电1568
    杭电1398
  • 原文地址:https://www.cnblogs.com/robyn/p/3528167.html
Copyright © 2011-2022 走看看