数据库-并发控制
当多个事务在数据库中并发执行时,数据的一致性可能受到破坏。系统有必要控制各事务之间的相互作用,这是通过并发控制机制的多种机制中的一种来实现的。
避免事务"饿死",授权加锁的条件:不存在在数据项Q上持有与M型锁冲突的锁的其他事务;不存在等待对数据项Q加锁且先于Ti申请加锁的事务。
常用的机制是各种封锁协议,时间戳排序,有效性检查,多版本机制。
封锁协议是一组阐明了事务合适对数据库中的数据项加锁解锁的规则。两阶段封锁协议仅在一个事务未曾释放任何数据项时允许该事务封锁新数据项。该协议保证可串行性,但不能避免死锁。在缺少有关数据项存取方式的信息是,两阶段封锁协议对保证可串行化来说不仅是必要的而且是充分的。
树形协议规则:1、Ti的首次加锁可以对任何数据项进行。2、此后Ti对数据项Q加锁的前提是Ti持有Q的父项上的锁。3、对数据项解锁可以随时进行。4、数据项被Ti加锁并解锁后,Ti不能再对该数据项加锁。
时间戳排序机制通过事先在每对事务之间选择一个顺序来保证可串行性。系统中的每个事务对应一个唯一的固定的时间戳。事务的时间戳决定了事务的可串行化顺序。这样,如果事务Ti的时间戳小于事务Tj时间戳,则该机制保证产生的调度等价于事务Ti出现在事务Tj之前的一个串行调度。该机制通过回滚违反该次序的事务来保证这一点。
Thomas写规则:假设事务Ti发出write(Q)操作:
1、若TS(Ti)<R-timestamp(Q),则Ti产生的Q值是先前所需要的值,但系统已假定该值不会被产生。因此,write操作被拒绝,Ti回滚。
2、若TS(Ti)<W-timestamp(Q),则Ti试图写入的Q值已过时。因此,这个write操作可悲忽略。
3、其它情况是执行write操作,将W-timestamp(Q)视为TS(Ti)。
在大部分事务是只读事务,这样事务见冲突频度较低的情形下,有效性检查机制是一个适当的并发控制机制。系统中的每个事务对应一个唯一的固定的时间戳,串行性次序是由事务的时间戳决定的。在该机制中,事务不会被延迟。不过,事务要完成必须通过有效性检查,如果事务未通过有效性检查,则盖世五回滚到初始状态。
某些情况下把多个数据项聚为一组,将它们作为聚集数据项来处理效果可能更好,这就导致了多级粒度。小数据项嵌套于大数据项之中。这种层次结果可以图形化地表示为树。封锁按从根结点到叶结点的顺序进行,解锁则按从叶结点到根结点的顺序进行。
多版本并发控制机制基于每个事务写数据项时为该数据项创建一个新版本。读操作发出时,系统选择其中的一个版本进行读取。利用时间戳,并发控制机制保证确保可串行性的方式选取要读取的版本。
多版本最常用的技术是时间戳。对于系统中的每个事务Ti,我们将一个静态的唯一的时间戳与之关联,即为TS(Ti)。对于每个数据项Q,有一个版本序列<Q1,Q2,…Qm>与之关联。
防止死锁的一种方法是使用抢占与事务回滚;另一种方法是死锁检测与恢复机制。系统处于死锁状态当且仅当等待图中包含环。