我们简要地讨论了这个问题 第一类并发控制协议 ,即基于锁的协议。
现在,回想一下我们上次讲到的地方,有两种锁可用 共享S(a) 和 独家X(a) .在没有任何限制的情况下实现这个锁系统,我们就可以使用简单的基于锁的协议(或 二进制锁 ),但它也有自己的缺点 不保证可序列化 。时间表可能遵循上述规则,但可能会导致不可序列化的时间表。
为了保证可串行化,我们必须遵循一些附加协议 关于锁定和解锁操作的定位 在每笔交易中。这就是两相锁定(2-PL)的概念,2-PL确保了可串行化。现在,让我们深入挖掘!
两相锁定–
如果锁定和解锁可以分两个阶段完成,则称交易遵循两阶段锁定协议。
- 成长阶段: 可以获取数据项的新锁,但不能释放任何锁。
- 收缩阶段: 可以释放现有锁,但无法获取新锁。
注—— 如果允许锁转换,则在生长阶段允许锁升级(从S(a)到X(a)),在收缩阶段必须进行锁降级(从X(a)到S(a))。
让我们来看一个实现2-PL的事务。
T 1. | T 2. | |
---|---|---|
1. | 锁-S(A) | |
2. | 锁-S(A) | |
3. | 锁X(B) | |
4. | ……. | …… |
5 | 解锁(A) | |
6. | 锁X(C) | |
7. | 解锁(B) | |
8. | 解锁(A) | |
9 | 解锁(C) | |
10 | ……. | …… |
这只是一个框架事务,展示了如何使用2-PL解锁和锁定。注意: 交易记录T 1. :
- 生长阶段从步骤1-3开始。
- 收缩阶段来自步骤5-7。
- 锁定点在3
交易记录T 2. :
- 生长阶段从步骤2-6开始。
- 收缩阶段来自步骤8-9。
- 6点锁定
嘿,等等! 是什么 锁定点? 增长阶段结束的点,即当事务获得继续其工作所需的最终锁时。现在看看时间表,你一定会明白的。
我已经说过2-PL确保了可序列化性,但2-PL仍有一些缺点。让我们看看缺点:
2-PL中的级联回滚– 让我们看看下面的时间表:
花点时间分析一下日程安排。是的,你是对的,因为T中的脏读物 2. 和T 3. 分别在第8行和第12行中 1. 如果我们失败了,我们也必须击退其他人。因此 级联回滚在2-PL中是可能的。 我以骨架时间表为例,因为当它保持简单时很容易理解。当用多变量的实时事务问题来解释时,它变得非常复杂。
2-PL中的僵局- 考虑这个简单的例子,很容易理解。假设我们有两笔交易 1. 和T 2. .
Schedule: Lock-X1(A) Lock-X2(B) Lock-X1(B) Lock-X2(A)
绘制优先图,可以检测循环。所以在2-PL中死锁也是可能的。
两阶段锁定还可能会限制计划中发生的并发量,因为事务可能无法在使用项目后释放该项目。这可能是因为我们可能会在时间表上设置协议和其他限制,以确保可序列化性、死锁自由和其他因素。这是我们为确保可序列化性和其他因素而必须付出的代价,因此可以将其视为并发性和维护ACID属性之间的交易。
上述类型的2-PL被称为 基本2PL .总之,它确保了冲突序列化,但 没有 防止级联回滚和死锁。此外,我们将研究另外三种类型的2PL,严格2PL,保守2PL和严格2PL。
登机门相关问题: