两段锁协议是指同一事务对任何数据进行读写之前必须对该数据加锁,在释放一个封锁之后,该事务不再申请和获得任何其他封锁。
事务分为两个阶段:
第一阶段是获得封锁,也称为扩展阶段。
第二阶段是释放封锁,也称为收缩阶段。
T1:Slock A…Slock B…Xlock C…Unlock B…Unlock A…Unlock C
T2:Slock A…Unlock A…Slock B…Xlock C…Unlock C…Unlock B
T1符合两段锁协议,T2不符合。因为整个加锁阶段不能有解锁,解锁阶段不能有加锁。
可串行化是一个调度,是多个事务之间的执行方式。
多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行这些事务时结果相同时,这种调度策略是可串行化(Serializable)调度。
可串行性是并发事务正确调度的准则。一个给定的并发调度,当且仅当它是可串行化的,才是正确的。
如果事务遵循两段锁协议,那么它们的并发调度是可串行化的。两段锁是可串行化的充分条件,但不是必要条件。
即:遵循两段锁协议,一定是可串行化的;不遵循两段锁协议,可能是可串行化的,也可能不是。
采用两段锁协议也有可能产生死锁,这是因为每个事务都不能及时解除被封锁的数据,可能会导致多个事务都要求对方已经封锁的数据而不能继续运行。