基础版两阶段锁协议

  • 每种锁协议都不是万能的;
  • 存在不遵守两阶段锁协议的可冲突化调度;

描述

要求每个事务分别在两个阶段发出加锁和解锁请求:

  1. 成长阶段
    获取锁,但不释放任何锁;
  2. 收缩阶段
    释放锁,但不再获取任何锁

最初,一个事务处于成长阶段:该事务按需获取锁。
一旦该事务释放了一个锁,则该事务就进入收缩阶段,不再发出任何锁请求。

性质

  1. 基础版两阶段锁协议保证了冲突可串行化

  2. 可能会发生死锁


    基础版两阶段死锁示例.png
  3. 可能会发生联级回滚

    • 如果事务T_5在事务T_7执行read(A)后失败了,就会引发事务T_6和事务T_7的联级回滚;
      联级回滚.png
    • 这类联级回滚可通过strict两阶段锁协议和rigorous两阶段锁协议得到清除;

示例

非两阶段锁示例

事务T_1

T1: lock-X(B); 
    read(B);
    B := B − 50; 
    write(B); 
    unlock(B); 
    lock-X(A); 
    read(A);
    A := A + 50; 
    write(A); 
    unlock(A).

事务T_2

T2: lock-S(A); 
    read(A);
    unlock(A); 
    lock-S(B); 
    read(B); 
    unlock(B); 
    display(A + B).
两阶段锁示例

事务T_3

T3: lock-X(B); 
    read(B);
    B := B − 50; 
    write(B); 
    lock-X(A); 
    read(A);
    A := A + 50; 
    write(A); 
    unlock(B); 
    unlock(A).

事务T_4

T4: lock-S(A); 
    read(A);
    lock-S(B); 
    read(B); 
    display(A + B); 
    unlock(A); 
    unlock(B).
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容