课堂知识

并发控制机制

大概可以分为悲观的乐观的两种

悲观锁:认为数据库的一致性经常会受到破坏,因此在事务访问数据对象前必须采取一定措施进行控制,只有得到访问许可时,才能访问数据对象,如基于封锁的并发控制方法。 ——事前控制 乐观锁:乐观的并发控制方法认为数据库的一致性一般是不会被破坏的,因此事务执行的过程中是可以直接访问数据的。只是在事务结束的时候才验证数据库的一致性是否被破坏,如基于有效性的验证方法。——事后验证

基于封锁方法的基本思想

基本思想:当事务T需要访问数据对象Q的时候,先申请对Q的锁。如果批准获得,那么事务T就继续进行,且此后不允许其他事务修改Q,直到事务T释放对Q的锁为止。

如果申请对Q的锁的时候,Q已被上锁,那么该事务就会阻塞等待。

基本锁类型:

  • 共享锁(shared lock, S锁):如果事务T获得了数据对象Q的共享锁,那么事务T可读Q但是不能写Q。
  • 排他锁(eXclusive lock, X锁):如果事务T获得了数据对象Q的排他锁,那么事务T既可以读Q也可以写Q

基本锁类型的相容性原则:

  • 共享锁和共享锁是相容的。(读操作不会影响事务之间数据的一致性)。
  • 排他锁和共享锁、排他锁和排他锁之间是不相容的(写操作可能影响事务之间数据的一致性)。

申请和释放锁:

  • SL(Q)——申请数据对象Q上的共享锁
  • XL(Q)——申请数据对象Q上的排它锁
  • UL(Q)——释放数据对象Q上的锁

第15章 并发控制——锁 - 图1


第15章 并发控制——锁 - 图2

封锁协议

运用X锁和S锁对数据对象加锁的时候,需要约定一些规则:

  • 何时申请X锁和S锁
  • 持锁时间以及锁在何时释放

常用的封锁协议:三级封锁协议

  1. 一级封锁协议:
  • 事务T在修改数据R之前必须对R加上X锁,直到事务结束才释放,事务结束包括正常结束(COMMIT)非正常结束(ROLLBACK)
  • 一级封锁协议可以防止丢失修改
  • 但是不能防止读脏数据,也不能保证可重复读

会读取到其他事务的中间临时数据

image.png

  1. 二级封锁协议:
  • 在一级封锁协议的基础上,在读取数据R之前必须先加上S锁,在读取完后就释放S锁
  • 二级封锁协议可以防止丢失修改和读“脏”数据,但不能保证可重复读

image.png

  1. 三级封锁协议:
  • 在一级封锁协议的基础上,事务T在读取数据R之前,必须对R加上S锁,并且直到事务结束才释放S锁
  • 三级封锁协议,可以防止丢失修改、读脏数据和不可重复读

image.png

封锁协议的两阶段

两阶段封锁协议要求每个事务分成两个阶段完成封锁操作:

  • 增长阶段:事务可以获得锁,但是不能释放锁
  • 缩减阶段:事务可以释放锁,但不能获得新锁

两阶段可能造成的问题:

  1. 产生死锁现象
    事务A对数据A上X锁,事务B对数据B上X锁,然后在事务A中又申请对B上X锁,在事务B中又申请对A上X锁,最后两个事务互相等待锁,造成死锁
    image.png

    并发控制