分布式系统中的并发控制:两阶段锁(Two-Phase Locking, 2PL)协议
字数 1150 2025-10-31 18:33:05
分布式系统中的并发控制:两阶段锁(Two-Phase Locking, 2PL)协议
题目描述
两阶段锁(2PL)是一种经典的分布式并发控制协议,用于协调多个事务对共享数据的访问,避免读写冲突、保证可串行化调度。其核心规则是:每个事务必须分两个阶段加锁与释放锁,即增长阶段(只能获取锁)和收缩阶段(只能释放锁)。在分布式环境中,锁管理器可能分散在不同节点,需通过锁协商机制保证全局一致性。
解题过程循序渐进讲解
步骤1: 理解2PL的基本规则与目标
- 问题场景:多个分布式事务并发读写数据库中的不同数据项,需防止脏读、丢失更新等异常。
- 核心规则:
- 增长阶段:事务在执行任何数据操作前必须获取对应锁(读锁或写锁),此阶段不能释放任何锁。
- 收缩阶段:事务释放第一个锁后,进入收缩阶段,此阶段只能释放锁而不能申请新锁。
- 目标:通过锁的阶段分离,确保事务间的冲突操作可串行化排序。
步骤2: 分布式环境下的锁管理机制
- 锁管理器分布:每个数据项的主副本所在节点负责管理该数据的锁。事务需向多个节点的锁管理器申请锁。
- 锁协商流程:
- 事务协调者向所有涉及的数据节点发送锁请求(读锁可共享,写锁需排他)。
- 各锁管理器检查冲突:若请求的锁与已持有锁兼容则立即授予;否则阻塞请求,加入等待队列。
- 事务需获得所有所需锁后,才能执行本地数据操作。
步骤3: 严格2PL(Strict 2PL)的优化
- 基本2PL的缺陷:收缩阶段过早释放锁可能导致级联回滚(其他事务可能读到未提交的数据)。
- 严格2PL的改进:事务持有所有锁直到提交或回滚时才一次性释放。此举避免级联回滚,简化恢复流程。
- 分布式实现:事务提交前,协调者通知所有节点持久化日志;提交确认后,再统一释放所有锁。
步骤4: 死锁处理与预防
- 死锁风险:分布式环境下,多节点锁等待可能形成循环依赖(例如事务T1等待T2持有的锁,T2等待T1持有的锁)。
- 解决方案:
- 超时机制:若锁等待超时,事务主动回滚并重试。
- 死锁检测:构建全局等待图(通过节点间周期交换等待信息),检测循环后中止环中某个事务。
- 死锁预防:按全局顺序申请锁(如按数据项字典序),或使用等待-死亡(Wait-Die)等时间戳策略。
步骤5: 故障恢复与锁清理
- 节点故障:若锁管理器节点宕机,需通过副本或日志恢复锁状态。
- 事务中断:事务回滚时,需释放其所有锁并通知等待该锁的事务重新申请。
- 协调者故障:若事务协调者宕机,需通过超时机制或全局事务管理器清理其持有的僵尸锁。
总结
分布式2PL通过严格的锁阶段划分与全局锁协调,实现了可串行化隔离。其核心挑战在于死锁管理、故障恢复与性能优化(如锁粒度选择)。实际系统中常结合严格2PL与超时机制,平衡一致性与效率。