一、基于锁的协议 Lock-Based Protocols

1. 锁的基本原理

  1. 锁的类型

  2. 锁相容性矩阵 Lock-Compatibility Matrix

    S X
    S True False
    X False False
  3. 锁的缺陷

    示例:设计不佳导致无效的锁

    image.png

    • 上述锁无法保证序列执行:若在上述代码的 A 与 B 读取之间,其它事务对 A 或 B 的值进行了修改,则上述代码显示的(A+B)将与实际不符

    示例:死锁 Deadlock

    image.png

    • $T_4$ 的 lock-s(B) 等待 $T_3$ 释放 B 的排他锁, $T_3$ 的 lock-x(A) 等待 $T_4$ 释放 A 的共享锁,导致两个事务互相等待,造成死锁
    • 为解决死锁, $T_3,T_4$ 其一必须进行回滚并释放锁

2. 两阶段锁 Two-Phase Locking Protocol

  1. 两阶段锁 2PL

    对于每一个事务,分为两个阶段:

  2. 两阶段锁的分析

  3. 变体:Strict 2PL

  4. 变体:Rigorous 2PL

  5. 变体:2PL With Lock Conversions

    对于每一个事务,分为两个阶段:

示例:

image.png

3. 锁的实现

  1. 读与写的自动上锁

    // Read D
    if (T_i has a lock on D) {
    	read(D);
    }
    else {
    	wait until no other transaction has a lock-X on D...
    	lock-S(D);
    	read(D);
    }
    
    // Write D
    if (T_i has a lock on D) {
    	write(D);
    }
    else {
    	wait until no other transaction has a lock on D...
    	lock-X(D);
    	write(D);
    }
    
    // All locks are released after commit or abort
    
  2. 锁管理器 Lock Manager

    示例:锁表的实现

    image.png

    • 数据项 123 被事务 T1 和 T8 的共享锁锁定,事务 T2 等待该数据项的排他锁

4. 基于图的协议 Graph-Based Protocols

  1. 基于图的锁

  2. 树协议 Tree-Protocol

    image.png

    示例:

二、多粒度 Multiple Granularity