数据库锁

92 阅读3分钟

一、数据库锁介绍

  1. 数据库锁目的:处理并发问题

  2. 并发控制主要的技术手段:乐观锁、悲观锁和时间戳

二、数据库锁分类

  1. 悲观锁(Pessimistic Lock)
    正如其名,具有强烈的独特性和排他性,对数据被外界事务修改持保持态度,因此,在数据处理过程中,将数据处于锁定状态。 悲观锁实现主要靠数据库提供的锁机制,来保证数据不被外部系统修改。
  2. 乐观锁(Optimistic Lock)
    顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以,不会上锁。 但是在更新的时候会判断一下在此期间别人有没有更新这个数据,可以使用版本号等机制。
  3. 关系型数据库锁机制(行锁、表锁、共享锁(Share Lock)、排他锁(Exclusive Lock))
    1. 共享锁(Share Lock)
      共享锁也叫读锁,用于所有的只读数据操作。共享锁是非独占的,允许多个并发事务读取其锁定的资源。 性质:多个事务可封锁同一个共享页,任何事务都不能修改该页,通常是该页被读取完毕,S锁立即被释放。
    2. 排他锁(Exclusive Lock)
      排他锁也叫写锁,表示对数据进行写操作。如果一个事务对对象加了排他锁,其他事务就不能再给它加任何锁了。 性质:仅允许一个事务封锁此页,其他任何事务必须等到排他锁被释放才能对该页进行访问,排他锁一直到事务结束才能被释放。
    3. 更新锁
      更新锁,在修改操作的初始化阶段用来锁定可能要被修改的资源,这样可以避免使用共享锁造成的死锁现象。 性质:用来预定要对此页施加排他锁,它允许其他事务读,但不允许再施加更新锁或排他锁,当被读取的页要被更新时,则升级为排他锁,更新锁一直到事务结束时才能被释放。
    4. 行锁
      锁的作用范围是行级别。
    5. 表锁
      锁的作用范围是整张表。
    6. 活锁
      指的是T1封锁了数据R,T2同时也请求封锁数据R,T3也请求封锁数据R,当T1释放了锁之后,T3会锁住R,T4也请求封锁R,则T2就会一直等待下去 解决方法:采用“先来先服务”策略可以避免。
    7. 死锁
      就是我等你,你又等我,双方就会一直等待下去。比如:T1封锁了数据R1,正请求对R2封锁,而T2封住了R2,正请求封锁R1,这样就会导致死锁,死锁这种没有完全解决的方法,只能尽量预防。 解决方法:只能是撤销一个处理死锁代价最小的事务,释放此事务持有的所有锁,同时对撤销的事务所执行的数据修改操作必须加以恢复。