📅  最后修改于: 2020-12-12 07:46:09             🧑  作者: Mango
基于锁的协议
在这种类型的协议中,任何事务都必须先获得适当的锁,然后才能读取或写入数据。有两种类型的锁:
1.共享锁:
- 也称为只读锁。在共享锁中,数据项只能由事务读取。
- 它可以在事务之间共享,因为当事务持有锁时,它就无法更新数据项上的数据。
2.排他锁:
- 在互斥锁中,数据项可以通过事务读取和写入。
- 此锁是排他的,并且在此锁中,多个事务不会同时修改同一数据。
有四种可用的锁定协议:
1.简化锁协议
这是在事务处理时锁定数据的最简单方法。基于简单锁的协议允许所有事务在插入,删除或更新数据之前获得对数据的锁定。完成交易后,它将解锁数据项。
2.声明锁协议
- 声明前的锁定协议评估事务以列出需要锁定的所有数据项。
- 在开始执行事务之前,它向DBMS请求所有这些数据项上的所有锁定。
- 如果授予了所有锁,则此协议允许事务开始。事务完成后,它将释放所有锁。
- 如果未授予所有锁,则此协议允许事务回滚并等待直到授予所有锁。
3.两相锁定(2PL)
- 两阶段锁定协议将事务的执行阶段分为三个部分。
- 在第一部分中,当事务开始执行时,它会寻求所需锁的许可。
- 在第二部分中,事务获取所有锁。事务释放第一个锁后,便开始第三阶段。
- 在第三阶段,事务不能要求任何新的锁。它仅释放获得的锁。
2PL有两个阶段:
增长阶段:在增长阶段,事务可能会获得对数据项的新锁定,但不能释放任何锁定。
收缩阶段:在收缩阶段,可以释放事务持有的现有锁,但是无法获取新的锁。
在下面的示例中,如果允许锁转换,则可以发生以下阶段:
- 在生长期,可以升级锁(从S(a)到X(a))。
- 锁的降级(从X(a)到S(a))必须在缩小阶段完成。
例:
以下方式显示了2-PL如何进行解锁和锁定。
交易T1:
- 生长阶段:从步骤1-3开始
- 收缩阶段:从步骤5-7
- 锁定点: 3
交易T2:
- 生长阶段:从步骤2-6
- 收缩阶段:从步骤8-9开始
- 锁定点: 6
4.严格的两相锁定(Strict-2PL)
- Strict-2PL的第一阶段类似于2PL。在第一阶段,在获取所有锁之后,事务将继续正常执行。
- 2PL和strict 2PL之间的唯一区别是Strict-2PL在使用后不会释放锁。
- Strict-2PL等到整个事务提交后,然后一次释放所有锁。
- Strict-2PL协议不具有锁定释放的缩减阶段。
它没有2PL那样的级联中止。