释放第一把锁改变阶段

单独使用锁并不能自动确定事务调度是否正确,还要约定何时可以取得和释放。两阶段锁协议在增长阶段允许取得所需锁,进入收缩阶段后只释放锁,不再取得新锁。

阶段是针对每个事务的锁行为,不是要求所有事务一起经过同一个全局屏障。不同事务仍可交错执行;锁管理器依据已有持有者和请求类型,决定新的请求能否立即获得满足。

参考:[1]

限制调度,但仍可能等待

在所需访问由相应锁正确保护的模型中,两阶段锁可保证冲突可串行化;有些本来可串行化的调度也会被这种规则排除。因此它是一种足够的调度约束,并不是接受所有正确调度的万能判定器。

基本形式仍可能出现级联撤销和死锁。强严格两阶段锁等变体把锁保持到事务结束,避免其他事务提前依赖未完成修改,但这种更谨慎的安排也会延长某些等待。

参考:[1]

锁协议与提交协议分工不同

发生循环等待时,数据库还需检测或预防死锁,例如依据等待关系发现环,再选择一个事务撤销。两阶段结构本身不会保证每个事务都一直前进,也不能代替事务失败后的重试策略。

两阶段提交则让多个参与资源对提交或撤销作出一致决定,不是规定何时加锁。同一个系统可以同时需要并发控制和提交协调;名称都带“两阶段”,不代表它们能互相替代。

参考:[1] [2]