两段锁协议是指每个事务的执行可以分为两个阶段:生长阶段(加锁阶段)和衰退阶段(解锁阶段)
加锁阶段:在该阶段可以进行加锁操作。在对任何数据进行读操作之前要申请并获得S锁,在进行写操作之前要申请并获得X锁。加锁不成功,则事务进入等待状态,直到加锁成功才继续执行。
解锁阶段:当事务释放了一个封锁以后,事务进入解锁阶段,在该阶段只能进行解锁操作不能再进行加锁操作
两段锁协议要求每个事务中,所有的封锁请求先于所有的解锁请求。
例题:
已知事务T1 的封锁序列为:LOCK S(A)…LOCK S(B)…LOCK X(C)
…UNLOCK(B) …UNLOCK (A) …UNLOCK (C)
事务T2 的封锁序列为:LOCK S(A) …UNLOCK (A) …LOCK S(B)
…LOCK X(C) …UNLOCK (C) …UNLOCK (B)
则遵守两段封锁协议的事务是( )。
题解: 事务T1前面都是加锁阶段阶段,后面都是解锁阶段满足要求。
而事务T2又加锁又解锁,不满足要求。
总结:
增长阶段:事务可以获得锁,但不能释放锁 - 缩减阶段:事务可以释放锁,但不能获得新锁。对于一个事务而言,刚开始事务处于增长阶段,它可以根据需要获得锁;一旦该事务开始释放锁,它就进入了缩减阶段,就不能再发出加锁请求。
值得注意的是:事务的第一个解锁语句unlock被执行的时刻就是该事物缩减阶段的开始。