CMU15445 Lecture 17 Two-Phase Locking Concurrency Control

2PL是并发控制理论的一种实现方式

Transaction Locks

通过Lock来保证所有的execution schdule是serializable

lock manager管理lock的分配与释放
DBMS's lock-table 不需要持久化

  • Lock:当有transaction需要修改一个tuple,lock manager将rid塞到队列中,那么其他transaction就不能去获取这个tuple
  • Latch:在B+树index,光是单纯的使用lock并不能保证并发的正确性,如果没有latch,中间internal node会被修改,那么会出错

两阶段锁任然不能够保证serializable

Two-Phase Locking

  • 2PL是消极的,2PL会涉及级联回滚问题?

    2PL会有限制并发dirty read(也就是读到了还未commit的数据)dealock(即使是strong strict 2PL也不能解决deadlock)的问题,并且存在2PL并不能够允许所有的serializable都能够执行。strong strict 2PL 是指在commit或者abort的时候release lock,它能够防止级联终止

  • 2PL能够在一个transaction的所有queries执行之前,动态的决定是否一个transaction能够访问一个DBMS的对象

  • 阶段一:Growing:向lock manager获取锁。lock manager决定是否授予lock

  • 阶段二:Shrinking:当一个transaction归还了第一个lock,那么它就进入了Shrinking阶段,它只能够去release lock,而不能够去acquire lock
    前后两句话没有关系吧?

DeadLock Handling

有两种处理2PL中的deadlock

deadlock detection

通过wait-for graph检测deadlock?
回滚事务还分成: CompletelyMinimally
下面的划线4.是指考虑了该node涉及的级联rollback

对于deadlock的检测,这里存在一种检测频率与陷入deadlock的txn的时间长短之间权衡,

Deadlock Prevention

不论是wait-die还是wound-wait,都是保证了只有一个方向会wait。因为没有双向的wait,所以可以避免deadlock

对于abort的young transaction,在restart时赋予其原来abort之前的priority,这样可以防止饥饿

Lock Granularities

存在着一种在并行性系统开销之间的权衡
intention lock增加了并行性
Intention lock的存在目的:如果一个transaction需要对一个table加锁,那么它就是需要检测这个table的每一个tuple,但是这样花销很大,这时候可以在其它transaction对这个table的tuple加lock时,给这个table加一个intention lock。
SIX是指给table加上S-Lock,给其中某个tuple加上X-Lock
IX与IX为什么可以兼容?

对tuple加锁时,也需要对table加一定的锁

low-level lock太多,lock escalation会将直接将这些底层锁换成一个higher lock

一般来说,在使用DBMS时,不用显示的加锁

给整个数据库备份的时候,为了使得所有的table拿到同一个时间的数据,那么需要给整个数据库加一个S-lock

posted @ 2022-03-08 19:42  抿了抿嘴丶  阅读(96)  评论(0编辑  收藏  举报