知识卡片
两阶段锁协议保证可串行化的机制
内容
[[冲突可串行化的判定:前趋图有向无环]]是一种事后判定方法,无法在 事务陆续到达、边执行边提交的真实场景里使用。两阶段锁协议解决的 正是这个问题:它不要求提前知道整个调度、事后判定,而是给每个事务 的加锁/解锁行为定一条简单规则,只要所有事务都遵守这条规则,最终 执行结果就必然是冲突可串行化的——这条规则把”如何保证正确性”的 决策,从”需要全局信息的事后判断”转化成”只需要局部信息的执行期 约束”。具体规则是把一个事务的生命周期切成两个阶段:增长阶段只能 申请获得新锁、不能释放已有的锁;收收缩阶段只能释放锁、不能再申请 新锁——一旦某个事务开始释放第一把锁,就不允许它再去申请任何新锁了。 这条”先只加不放,再只放不加”的规则强制了一个关键效果:两个事务对 同一数据的冲突操作,其加锁窗口不可能出现”交叉重叠又反复切换”的 情况,从而排除了产生前趋图环路的可能性。代价是牺牲了一部分并发度: 遵守两阶段锁协议的事务在执行过程中经常需要提前拿到之后才会用到的 锁、或者推迟释放已经用完的锁,这意味着其他等待这些锁的事务要多 等一会儿——但相比”结果可能错”,”执行慢一点但结果保证对”是可以 接受的代价。
参考来源
- 位置:《数据库原理(微课版)》第11章《事务处理技术》11.3.1节"基于锁
的并发控制概述"(源文件:_epub-src/index_split_007.html)
- 结论依据:原文明确"若任何一个事务的加锁、解锁操作符合两阶段锁协议
,那么任何一个对事务的调度的执行结果等价于一个串行调度,即执行
结果是正确的……增长阶段,在这个阶段事务只能不断地获得锁,不能
释放锁;收缩阶段,在这个阶段事务只能释放锁,不能获取新的锁……
使用两阶段锁协议不需要知道一个调度中每个事务的所有操作后再安排
其执行顺序,它会在调度进行的过程中避免不可串行化情况的发生",
因此可以推出两阶段锁协议如何在执行期而非事后保证可串行化。
- 原始内容:两阶段锁协议规定了一个事务在运行的过程中如何跟其他事务
之间协调申请和释放锁的操作,从而实现可串行化。使用两阶段锁协议
不需要知道一个调度中每个事务的所有操作后再安排其执行顺序。