解释两阶段锁定 (2PL) 协议 (DBMS)


数据库的锁定和解锁应该以一种不会出现不一致性、死锁和饥饿的方式进行。

2PL 锁定协议

每个事务将以两个不同的阶段锁定和解锁数据项。

  • 增长阶段 - 所有锁都在此阶段发出。在对数据项的所有更改提交后,不会释放任何锁,然后第二阶段(收缩阶段)开始。

  • 收缩阶段 - 此阶段不会发出任何锁,所有对数据项的更改都会被记录(存储),然后释放锁。

2PL 锁定协议的示意图如下所示:

在增长阶段,事务到达一个点,此时它可能需要的所有锁都已获取。这个点称为锁定点。

锁定点到达后,事务进入收缩阶段。

类型

两阶段锁定有两种类型:

严格的两阶段锁定协议

事务可以在锁定点之后释放共享锁,但它不能在事务提交之前释放任何排他锁。此协议创建了一个级联较少的调度。

级联调度:在此调度中,一个事务依赖于另一个事务。因此,如果一个事务需要回滚,则另一个事务也必须回滚。

严格的两阶段锁定协议

事务不能在提交之前释放任何锁,无论是共享锁还是排他锁。

2PL 协议保证可串行化,但不能保证不会发生死锁。

示例

假设 T1 和 T2 是两个事务。

T1=A+B 和 T2=B+A

T1T2
Lock-X(A)Lock-X(B)
读取 A;读取 B;
Lock-X(B)Lock-X(A)

这里,

Lock-X(B):由于 B 被 T2 锁定,因此无法执行 Lock-X(B)。

Lock-X(A):由于 A 被 T1 锁定,因此无法执行 Lock-X(A)。

在上述情况下,T1 等待 B,T2 等待 A。等待时间永无止境。至少在其中一个事务自愿释放锁之前,这两个事务都无法继续执行。这种情况称为死锁。

等待图如下所示:

等待图:它用于死锁检测方法,为每个事务创建一个节点,如果 Ti 正在等待锁定由 Tj 锁定的项目,则创建一条从 Ti 到 Tj 的边。WFG 中的循环表示发生了死锁。WFG 定期创建。

更新于: 2023-11-07

51K+ 浏览量

启动您的 职业生涯

通过完成课程获得认证

开始
广告
© . All rights reserved.