q 两阶段封锁(Two-phase locking - 2PL):
n 首先,两阶段封锁强调的是“加锁(增长阶段,growing phase)和解锁(缩减阶段,shrinking phase)这两项操作,且每项操作各自为一个阶段”,这就是说不管同一个事务内需要在多少个数据项上加锁,那么所有的加锁操作都只能在同一个阶段完成,在这个阶段内,不允许对对已经加锁的数据项进行解锁操作,即加锁和解锁操作不能交叉执行(同一个事务内)。这一条是说在同一个事务内部的事情。
n 其次,为了提高并发度,才对锁进行分类,分出共享锁(读锁)和排它锁(写锁),因这两种类型的锁,又产生加两种锁共四种事务之间受影响的情况:
u 一是先对数据项加共享锁,则此读锁不阻塞其他事务也读取本数据项,这就是说读读并发是允许的,即第一种情况;但是此读锁阻塞其他事务写本数据项,这就是说读写并发是不允许的,即第二种情况;这里所说的读读和读写的第一个读在前,是因;第二个读或写是可能在其他事务发生的操作,是果,前者(第二个读操作)能够发生后者(写操作)不能够发生。
u 二是对数据项施加了排它锁,这使得其他事务在这个数据项上的读操作(第三种情况)或写操作(第四种情况)都被禁止。
u 这一条是说在多个事务之间的事情。
u 多个事务之间比较锁是否兼容,用到了锁的兼容性列表,就是上面的四种情况。只是当锁的类型被扩展后,增加了意向锁等类型,才使得锁的兼容性列表变大,不再是四种情况,而是更多种。
n 第三,共享锁是允许向排它锁升级的,排它锁是允许向共享锁降级的,升级(upgrade)和降级(downgrade)操作,称为锁转换(lock conversion)。升级只能发生在增长阶段,降级只能发生在缩减阶段。升降级发生在同一个事务内部,但目的也是为了提高多个事务之间的并发度。同一个事物内部比较锁是否兼容,用到的是锁的升级列表,这与锁的兼容性列表是不同的。
n 所以,两阶段的含义是指在同一个事务内,对所涉及的所有数据项进行先加锁,然后才对所有的数据项解锁。但两阶段封锁第一阶段加共享锁后影响了其他事务的写操作、加排它锁后影响了其他事务的读操作(读受影响更不用提写),所以较大地影响了其他事务的运行(如果不操作相同数据项则互不影响)。只有第二阶段释放了所有的数据项上的锁之后,才能运行其他要操作相同数据项的事务。