课程复习——数据库系统概论(第4版 王珊 萨师煊 高等教育出版社)—— 第十一章 并发控制

来源:互联网 发布:企业工商信息数据库 编辑:程序博客网 时间:2024/05/22 04:51

在单处理机系统中,事务的并行执行实际上是并行事务的并行操作轮流交叉运行,这种并行执行方式称为交叉并发方式。

在多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个失误真正地并发运行,这种并行执行方式成为同时并发方式。

并发控制机制是衡量一个数据库管理系统性能的重要标志之一。

并发控制概述

事务是并发控制的基本单位,保证事务ACID特性,是失误处理的重要任务。保证失误的个理性和一只行,DBMS需要对并发操作进行正确调度。

并发操作带来的数据不一致性主要包括丢失修改(两个事务读入同一数据并修改,一个提交的结果破坏了另一个提交的结果,导致前一个提交的结果的丢失)、不可重复读(一个事务读取数据后,另一个失误对其读取的内容执行更新操作(修改该数据,删除其中部分记录,出入新纪录(后两种成为幻影现象)),当前一个再次读取该数据后,得到的结果与上一次得到的结果不同)和读“脏”数据(一个失误修改某数据,并写回磁盘,另一个事务读取该数据后,前一个事务又因为某原因撤销该操作,导致后一个事务读出的内容与数据库内容不一致)等。

产生上述数据不一致性的主要原因是并发操作破坏了事务的隔离性。

而数据库的应用有时允许某些不一致性。例如统计工作中,个别脏数据对统计精度影响不大。

并发控制的主要技术有:封锁(Locking)、时间戳(Timestamp)和乐观控制法,商用的DBMS一般都采用封锁方法。

封锁

封锁是实现并发控制的一个非常重要的技术。基本封锁类型有:排它锁(Exculsive Locks,简称X锁)和共享锁(Share Locks,简称S锁)。

事务对某数据对象加X锁后,不允许其他事务对该数据对象加任何对象的锁。事务对某数据对象加S锁,允许其他事务对该数据对象加S锁,不允许任何事务对其加X锁。

在实际运用中,当你要对某数据对象修改时,要对其加X锁,只读而不修改时加S锁。

活锁和死锁

活锁

当多个事务请求封锁同一数据对象时,封锁子系统对请求封锁的事务的响应策略导致某一事物一直等待,这称为活锁。

避免活锁的简单方法是采用先来先服的策略。封锁子系统按照请求封锁的先后次序对事务排队,数据对象上的锁一旦释放就按照批准申请队列中第一个事务获得锁。

死锁

一个事务等待另一个事务封锁了的数据对象,而那个事务也在等待这个事务封锁的数据对象,这种现象称为死锁。

数据库中解决死锁问题主要有两种方法:1.预防。2.定期诊断,并解决。

1.死锁的预防

(1)一次性封锁法(每个事务一次将所有要使用的数据全部加锁)。问题:1.降低系统的并发度;2.很难精确地确定每个事务所要封锁的数据对象,从而扩大封锁范围,进一步降低并发度。

(2)顺序封锁法(预先对数据对象规定一个封锁顺序,所有的事务都按照这个顺序实行封锁)。问题:1.维护封锁顺序困难,成本高;2.很难去确定每个事务要封锁哪些对象。

DBMS采用的是诊断并解除死锁的方法。

2.死锁的诊断与解除

诊断:超时法或事务等待图法。

(1)超时法(如果某一事务的等待时间超过了规定的实现,就认为发生了死锁)。问题:1.可能误判;2.时限太长无法及时发现。

(2)事务等待图法(并发控制子系统周期性地生成事务等待图,如果事务等待图中存在回路,则表示出现了死锁)。
解除:选择一个处理死锁代价最小的事务,将其撤销,释放该事务持有的所有的锁,撤销该是无所执行的数据修改。

11.4  并发调度的可串行性

11.4.1 可串行化调度

定义:多个事务的并发执行是正确的,当且仅当期结果与按某一次序串行地执行这些事务时的结果相同,成这高中调度策略为可串行化的调度。

可串行性(Serializability)是并发事务正确调度的标准。按照这个准则规定,一个给定的并发调度,当且仅当他是可串行化的,才认为是正确调度。

11.4.2 冲突可串行化调度

定义:冲突操作是指余的事务对同一个数据的读写操作和写写操作:Ri(x)与Wj(x)和Ri(x)与Wj(x);

其他操作是不冲突操作。

不同是无的冲突操作和同一事务的两个操作是不能交换(swap)的。

一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突操作的次序得到另一个调度Sc‘,如果Sc'是串行的,成调度Sc为冲突可串行化的调度。一个调度是冲突可串行化,一定是可串行化的调度,反之不一定。

11.5 两段锁协议

目前DBMS普遍采用两段锁(Tow-Phase Locking,简称2PL)洗衣的方法实现并发调度的可串行性,从而保证调度的正确性。

定义:在运用封锁方法是,对数据对象加锁需要约定一些规则,例如何时申请封锁、持锁时间、可是释放封锁等。这些规则成为封锁协议。

两段锁协议是常用的一种封锁协议,理论上已经证明使用两段锁协议产生的是可串行化调度。

定义:两段锁协议:所有事务必须分为两个阶段对数据项加锁和解锁,在对任何数据进行读和写操作之前,首先要申请并获得对该数据的封锁,在释放一个封锁后,事务不再申请和或等任何其他封锁。

事务遵守两段锁协议时间可串行化调度的充分条件,不是必要条件。

两段锁协议和防止死锁的一次封锁发的异同之处:一次封锁要求每个事务必须一次价格所有要使用的数据全部加锁,否则就不能继续执行。因此一次封锁法遵守两段锁协议;但是两段锁协议并不要求是必须一次将所有要使用的数据全部加锁,因此遵守两端说协议的事务有可能发生死锁。如图:p302

11。6 封锁的粒度

定义:封锁对象的大小称为封锁粒度(Granularity)。封锁对象可以是逻辑单元,也可以是物理单元。

封锁粒度与系统的并发度和并发控制的开销密切相关。封锁粒度越大,数据库所能封锁的数据单元就越少,并发度就越小,系统开销也越小;反之也成立。

一个系统中同时支持多种封锁粒度共不同的事务选择是比较理想的,这种封锁方法成为多粒度封锁(Multiple Granularity Locking)。一般来说,需要处理大量远足的事务可以以关系为封锁粒度;需要处理多个关系的大量远足的事务可以以数据库为封锁粒度;而对于一个处理少量怨毒的用户事务,以元祖为封锁粒度比较何止了。

11.6.1 多粒度封锁

多粒度数的根节点是整个数据库,表示最大的数据粒度。也家电标志最小的数据粒度。

多粒度封锁协议允许多粒度数中的每个节点被独立地加锁。对一个节点加锁意味着这个节点的所有后裔结点也被加以同样类型的锁。

显式封锁是应事务的要求直接加到数据对象上的封锁;

隐式封锁是该数据对象美誉独立加锁,是由于其上级结点加锁而使该数据对象加上了锁。

系统检查封锁冲突时不仅要检查显式封锁还要检查隐式封锁(他们的效果一样)。导致效率低下。

DBMS使用意向锁(Intent Lock)避免诸葛检查下一级结点的显示封锁。

11.6.2 意向锁

定义:如果对一个结点加意向锁,则说明该结点的下层节点正在被加锁;对任意节点加锁是,必须对他的上层结点加意向锁。

三种常用的意向锁:意向共享锁(Intent Share Lock, 简称IS);意向排它锁(Intent ExclusiveLock,简称IX);共享意向锁(Share Intent Exclusive Lock,简称SIX);

SIX表示该事务要读整个表(所以对该表加S锁),同时会更新个别元组(所以对该表加IX锁);SIX=S+IX;

11.7 小结

数据库的重要特征是它能为多个用户提供数据共享。数据库管理系统允许共享的用户数目是数据库管理系统重要标志之一。数据库管理系统必须提供并发控制机制来协调并发用户的并发操作以保证并发事务的隔离性和一致性,保证数据库的一致性。

两段锁协议可以保证事务调度的正确性。



0 0