解释两阶段锁定 (2PL) 协议 (DBMS)
数据库的锁定和解锁应该以一种不会出现不一致性、死锁和饥饿的方式进行。
2PL 锁定协议
每个事务将以两个不同的阶段锁定和解锁数据项。
增长阶段 - 所有锁都在此阶段发出。在对数据项的所有更改提交后,不会释放任何锁,然后第二阶段(收缩阶段)开始。
收缩阶段 - 此阶段不会发出任何锁,所有对数据项的更改都会被记录(存储),然后释放锁。
2PL 锁定协议的示意图如下所示:

在增长阶段,事务到达一个点,此时它可能需要的所有锁都已获取。这个点称为锁定点。
锁定点到达后,事务进入收缩阶段。
类型
两阶段锁定有两种类型:
严格的两阶段锁定协议
事务可以在锁定点之后释放共享锁,但它不能在事务提交之前释放任何排他锁。此协议创建了一个级联较少的调度。
级联调度:在此调度中,一个事务依赖于另一个事务。因此,如果一个事务需要回滚,则另一个事务也必须回滚。
严格的两阶段锁定协议
事务不能在提交之前释放任何锁,无论是共享锁还是排他锁。
2PL 协议保证可串行化,但不能保证不会发生死锁。
示例
假设 T1 和 T2 是两个事务。
T1=A+B 和 T2=B+A
| T1 | T2 |
|---|---|
| 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 定期创建。
广告
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP