12.2.5 两段锁协议

2025-07-29 16:56:02 更新

通过对数据加锁,可以限制其他事务对数据的访问,但这会降低事务的并发性。如何在保证事务的一致性的前提下尽可能地提高并发性,需要封锁协议来解决。

封锁协议:是对数据加锁类型、加锁时间和释放锁时间的一些规则描述。

封锁协议主要有三级封锁协议,以及两段锁协议。

封锁协议有三个级别:一级封锁协议、二级封锁协议和三级封锁协议。




效果

1

一级封锁协议

是事务在修改数据前必须先对其加X锁,直到事务结束才释放X锁。

解决了丢失修改

2

二级封锁协议

包含一级封锁协议

事务在读取数据前必须对其加上S锁,读完后立刻释放S锁

解决了读脏数据

未解决不可重复读(读取数据后,数据被其他事务修改,再读会出错)

3

三级封锁协议

包含一级封锁协议

事务在读取数据前必须对其加上S锁,直到事务结束才释放S锁。

解决了不可重复读(读数据期间,其他事务只能读该数据而不能修改)


2-两段锁协议

两段锁协议(Two-phase locking Protocol):是指对任何数据进行读写之前,必须对该数据加锁;在释放一个封锁之后,事务不再申请和获得任何其他封锁。

“两段”锁:事务分为两个阶段。第一阶段是获得封锁,也称为扩展阶段;第二阶段是释放封锁,也称为收缩阶段。

为了确保事务并行执行的正确性,许多系统采用两段锁协议。同时系统设有死锁检测机制。发现死锁后按一定的算法解除死锁。

2)两段锁协议与可串行化

如果事务都遵循两段锁协议,那么它们的并发调度是可串行化的。

两段锁是可串行化的充分条件,但不是必要条件。即如果事务不遵循两段锁协议,那么它们的并发调度可能是可串行化的,也可能是不可串行化的。

注意:采用两段锁协议也可能产生死锁,因为每个事务都不能及时解除被它封锁的数据,可能导致多个事务互相都要求对方已封锁的数据,不能继续运行。

3.活锁与死锁

活锁:是指多个事务请求封锁数据D,系统始终不批准某事务T的请求,使得T可能永远等待的现象。

死锁:是指两个以上事务分别请求封锁对方已经封锁的数据,导致长期等待而无法继续运行下去的现象。