数据库管理系统普遍采用两段锁协议的方法实现并发调度的可串行性,从而保证调度的正确性
两段锁协议
指所有事务必须分两个阶段对数据项加锁和解锁
在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁
在释放一个封锁之后,事务不再申请和获得任何其他封锁
“两段”锁的含义
事务分为两个阶段
第一阶段是获得封锁,也称为扩展阶段
事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁
第二阶段是释放封锁,也称为收缩阶段
事务可以释放任何数据项上的任何类型的锁,但是不能再申请任何锁
例
事务Ti遵守两段锁协议,其封锁序列是 :
Slock A Slock B Xlock C Unlock B Unlock A Unlock C;
|← 扩展阶段 →| |← 收缩阶段 →|
事务Tj不遵守两段锁协议,其封锁序列是:
Slock A Unlock A Slock B Xlock C Unlock C Unlock B;
图的调度是遵守两段锁协议的,因此一定是一个可行化调度。
如何验证?
事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件。
若并发事务都遵守两段锁协议,则对这些事务的任何并发调度策略都是可串行化的
若并发事务的一个调度是可串行化的,不一定所有事务都符合两段锁协议
两段锁协议与防止死锁的一次封锁法
一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行,因此一次封锁法遵守两段锁协议
但是两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁
[例]遵守两段锁协议的事务发生死锁
欢迎大家加我微信交流讨论(请备注csdn上添加)