1.可串行性
并行操作对并行事务的操作的调度是随机的,不同的调度可能产生不同的结果。在这些不同的调度中,肯定有些调度的结果是正确的,究竟哪些调度是正确的呢?
若每个事务的基本操作都串连在一起,没有其它事务的操作与之交叉执行,这样的调度称为串行调度,多个事务的的串行调度,其执行结果一定是正确的。但串行调度限制了系统并行性的发挥,而很多并行调度又不具有串行调度的结果,所以我们必须研究具有串行调度效果的并行调度方法。
定义:当且仅当某组并发事务的交叉调度产生的结果和这些事务的某一串行调度的结果相同,则称这个交叉调度是可串行化。
可串行化是并行事务正确性的准则,一个交叉调度,当且仅当它是可串行化的,它才是正确的。两段锁协议是保证并行事务可串行化的方法。
2.两段锁协议(Two-Phase Locking――2PL)
两段锁协议规定所有的事务应遵守的规则:
① 在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁。
② 在释放一个封锁之后,事务不再申请和获得其它任何封锁。
即事务的执行分为两个阶段:
第一阶段是获得封锁的阶段,称为扩展阶段。
第二阶段是释放封锁的阶段,称为收缩阶段。
例如
在这两个例子中T1遵守两段锁协议,T2释放锁后又获取锁,没有遵守两段锁协议。
定理:若所有事务均遵守两段锁协议,则这些事务的所有交叉调度都是可串行化的。
对于遵守两段协议的事务,其交叉并发操作的执行结果一定是正确的。值得注意的是,上述定理是充分条件,不是必要条件。一个可串行化的并发调度的所有事务并不一定都符合两段锁协议,存在不全是2PL的事务的可串行化的并发调度。
同时我们必须指出,遵循两段锁协议的事务有可能发生死锁。
此时事务T1 、T2同时处于扩展阶段,两个事务都坚持请求加锁对方已经占有的数据,导致死锁。
为此,又有了一次封锁法。一次封锁法要求事务必须一次性将所有要使用的数据全部加锁,否则就不能继续执行。因此,一次封锁法遵守两段锁协议,但两段锁并不要求事务必须一次性将所有要使用的数据全部加锁,这一点与一次性封锁不同,这就是遵守两段锁协议仍可能发生死锁的原因所在。
两段锁协议(2PL)