两段锁(2PL)理解

2018/11/29 19:30
阅读数 2.5K

两段锁即两阶段锁(Two-phase locking - 2PL):

首先,两阶段锁强调的是“加锁(增长阶段,growing phase)和解锁(缩减阶段,shrinking phase)这两项操作,且每项操作各自为一个阶段,这就是说不管同一个事务内需要在多少个数据项上加锁,那么所有的加锁操作都只能在同一个阶段完成,在这个阶段内,不允许对对已经加锁的数据项进行解锁操作,即加锁和解锁操作不能交叉执行(同一个事务内)。这一条是说在同一个事务内部的事情。

其次,为了提高并发度,才对锁进行分类,分出共享锁(读锁)和排它锁(写锁),因这两种类型的锁,又产生加两种锁共四种事务之间受影响的情况:

 一是先对数据项加共享锁,则此读锁不阻塞其他事务也读取本数据项,这就是说读读并发是允许的,即第一种情况;但是此读锁阻塞其他事务写本数据项,这就是说读写并发是不允许的,即第二种情况;这里所说的读读和读写的第一个读在前,是因;第二个读或写是可能在其他事务发生的操作,是果,前者(第二个读操作)能够发生后者(写操作)不能够发生。

二是对数据项施加了排它锁,这使得其他事务在这个数据项上的读操作(第三种情况)或写操作(第四种情况)都被禁止。

这一条是说在多个事务之间的事情。

多个事务之间比较锁是否兼容,用到了锁的兼容性列表,就是上面的四种情况。只是当锁的类型被扩展后,增加了意向锁等类型,才使得锁的兼容性列表变大,不再是四种情况,而是更多种。

第三,共享锁是允许向排它锁升级的,排它锁是允许向共享锁降级的,升级(upgrade)和降级(downgrade)操作,称为锁转换(lock conversion)。升级只能发生在增长阶段,降级只能发生在缩减阶段。升降级发生在同一个事务内部,但目的也是为了提高多个事务之间的并发度。同一个事物内部比较锁是否兼容,用到的是锁的升级列表,这与锁的兼容性列表是不同的。

所以,两阶段的含义是指在同一个事务内,对所涉及的所有数据项进行先加锁,然后才对所有的数据项解锁但两阶段封锁第一阶段加共享锁后影响了其他事务的写操作、加排它锁后影响了其他事务的读操作(读受影响更不用提写),所以较大地影响了其他事务的运行(如果不操作相同数据项则互不影响)。只有第二阶段释放了所有的数据项上的锁之后,才能运行其他要操作相同数据项的事务。
 

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部