最近在刷题,看到了一个锁协议相关的试题,做错了啊,学了不用就废了。
其实这题没有想象中那么难,首先要了解两段锁的概念:
两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁。
所以ABC都是正确的。
两段锁协议是指每个事务的执行可以分为两个阶段:生长阶段(加锁阶段)和衰退阶段(解锁阶段)。
加锁阶段:在该阶段可以进行加锁操作。在对任何数据进行读操作之前要申请并获得S锁,在进行写操作之前要申请并获得X锁。加锁不成功,则事务进入等待状态,直到加锁成功才继续执行。
解锁阶段:当事务释放了一个封锁以后,事务进入解锁阶段,在该阶段只能进行解锁操作不能再进行加锁操作。
两段封锁法可以这样来实现:事务开始后就处于加锁阶段,一直到执行ROLLBACK和COMMIT之前都是加锁阶段。ROLLBACK和COMMIT使事务进入解锁阶段,即在ROLLBACK和COMMIT模块中DBMS释放所有封锁。
另外要注意两段锁协议和防止死锁的一次封锁法的异同之处。一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行,因此一次封锁法遵守两段锁协议;但是两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁。
两阶段锁协议,整个事务分为两个阶段,前⼀个阶段为加锁,后⼀个阶段为解锁。在加锁阶段,事务只能加锁,也可以操作数据,但不能解
锁,直到事务释放第⼀个锁,就进⼊解锁阶段,此过程中事务只能解锁,也可以操作数据,不能再加锁。两阶段锁协议使得事务具有较⾼的
并发度,因为解锁不必发⽣在事务结尾。它的不⾜是没有解决死锁的问题,因为它在加锁阶段没有顺序要求。如两个事务分别申请了A, B
锁,接着⼜申请对⽅的锁,此时进⼊死锁状态。