并发控制课后答案-简述并发控制.doc

上传人:李司机 文档编号:1180720 上传时间:2022-07-15 格式:DOC 页数:7 大小:90KB
返回 下载 相关 举报
并发控制课后答案-简述并发控制.doc_第1页
第1页 / 共7页
并发控制课后答案-简述并发控制.doc_第2页
第2页 / 共7页
并发控制课后答案-简述并发控制.doc_第3页
第3页 / 共7页
并发控制课后答案-简述并发控制.doc_第4页
第4页 / 共7页
并发控制课后答案-简述并发控制.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《并发控制课后答案-简述并发控制.doc》由会员分享,可在线阅读,更多相关《并发控制课后答案-简述并发控制.doc(7页珍藏版)》请在三一办公上搜索。

1、第八章并发控制习题解答和解析1. 1.在数据库中为什么要并发控制答:数据库是共享资源,通常有许多个事务同时在运行。当多个事务并发地存取数据库时就会产生同时读取和/或修改同一数据的情况。假设对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性。所以数据库管理系统必须提供并发控制机制。2. 2.并发操作可能会产生哪几类数据不一致用什么方法能防止各种不一致的情况答:并发操作带来的数据不一致性包括三类:丧失修改、不可重复读和读脏数据。(1)丧失修改(Lost Update)两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了(覆盖了)T1提交的结果,导致T1的修改被丧失。(2)不

2、可重复读(Non -Repeatable Read)不可重复读是指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。不可重复读包括三种情况:详见概论8.1(P266)。(3)读脏数据(Dirty Read)读脏数据是指事务T1修改*一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于*种原因被撤销,这时T1已修改正的数据恢复原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据就为脏数据,即不正确的数据。防止不一致性的方法和技术就是并发控制。最常用的技术是封锁技术。也可以用其他技术,例如在分布式数据库系统中可以采用时间戳方法来进展并发控制。3. 3.什么是封锁

3、答:封锁就是事务T在对*个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新此数据对象。封锁是实现并发控制的一个非常重要的技术。4. 4.根本的封锁类型有几种试述它们的含义。答:根本的封锁类型有两种:排它锁(E*clusive Locks, 简称 * 锁 )和共享锁(Share Locks,简称 S 锁)。排它锁又称为写锁。假设事务T对数据对象A加上*锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。共享锁

4、又称为读锁。假设事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加*锁,直到T释放A上的S锁。这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。5.如何用封锁机制保证数据的一致性 答:DBMS在对数据进展读、写操作之前首先对该数据执行封锁操作,例如以下图中事务T1在对A进展修改之前先对A执行*Lock(A),即对A加*锁。这样,当T2请求对A加*锁时就被拒绝,T2只能等待T1释放A上的锁后才能获得对A的*锁,这时它读到的A是T1更新后的值,再按此新的A值进展运算。这样就不会丧失T1的更新。DBMS按照一定的封锁协议,对并发操作进展

5、控制,使得多个并发操作有序地执行,就可以防止丧失修改、不可重复读和读脏数据等数据不一致性。6.什么是封锁协议不同级别的封锁协议的主要区别是什么答:在运用封锁技术对数据加锁时,要约定一些规则。例如,在运用*锁和S锁对数据对象加锁时,要约定何时申请*锁或S锁、何时释放封锁等。这些约定或者规则称为封锁协议(locking Protocol)。对封锁方式约定不同的规则,就形成了各种不同的封锁协议、不同级别的封锁协议,例如概论中介绍的三级封锁协议,三级协议的主要区别在于什么操作需要申请封锁,何时申请封锁以及何时释放锁(即持锁时间的长短)。一级封锁协议:事务T在修改数据R之前必须先对其加*锁,直到事务完毕

6、才释放。二级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。三级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务完毕才释放。7.不同封锁协议与系统一致性级别的关系是什么答:不同的封锁协议对应不同的一致性级别。一级封锁协议可防止丧失修改,并保证事务T是可恢复的。在一级封锁协议中,对读数据是不加S锁的,所以它不能保证可重复读和不读脏数据。二级封锁协议除防止了丧失修改,还可进一步防止读脏数据。在二级封锁协议中,由于读完数据后立即释放S锁,所以它不能保证可重复读。在三级封锁协议中,无论是读数据还是写数据都加长锁,即都要到事务完毕才释放封锁

7、。所以三级封锁协议除防止了丧失修改和不读脏数据外,还进一步防止了不可重复读。下面的表格清楚地说明了封锁协议与系统一致性的关系。*锁S锁一致性保证操作完毕释放事务完毕释放操作完毕释放事务完毕释放不丧失修改不读脏数据可重复读一级封锁协议二级封锁协议三级封锁协议8.什么是活锁什么是死锁答:TI T2 T3 T4lock R . . . . lock R . . . 等待 lock R .Unlock等待 . lock R . 等待 . 等待 . 等待 . 等待 . 等待 Unlock 等待 . 等待 . lock R. 等待 . .如果事务T1封锁了数据R,事务T2飞又请求封锁R,于是T2等待。T3

8、也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求T2有可能永远等待,这就是活锁的情形。活锁的含义是该等待事务等待时间太长,似乎被锁住了,实际上可能被激活。如果事务Tl封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,因T2已封锁了R2,于是T1等待T2释放R2上的锁。接着T2又申请封锁R1,因T1已封锁了R1,T2也只能等待T1释放Rl上的锁。这样就出现了T1在等待T2,而T2又在等待Tl的局面,T1和T2两个事务永远不能完毕,形成死锁。T1 T2lock R1 . lock R2.

9、 .lock R2 .等待 .等待 lock R1等待等待9.试述活锁的产生原因和解决方法。答:活锁产生的原因:当一系列封锁不能按照其先后顺序执行时,就可能导致一些事务无限期等待*个封锁,从而导致活锁。防止活锁的简单方法是采用先来先效劳的策略。当多个事务请求封锁同一数据对象时,封锁子系统按请求封锁的先后次序对事务排队,数据对象上的锁一旦释放就批准申请队列中第一个事务获得锁。10.请给出预防死锁的假设干方法。答:在数据库中,产生死锁的原因是两个或多个事务都已封锁了一些数据对象,然后又都请求已被其他事务封锁的数据加锁,从而出现死等待。防止死锁的发生其实就是要破坏产生死锁的条件。预防死锁通常有两种方

10、法:(1)一次封锁法,要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行;(2)顺序封锁法,预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。不过,预防死锁的策略不大适合数据库系统的特点,具体原因可参见概论。11.请给出检测死锁发生的一种方法,当发生死锁后如何解除死锁答:数据库系统一般采用允许死锁发生,DBMS检测到死锁后加以解除的方法。DBMS中诊断死锁的方法与操作系统类似,一般使用超时法或事务等待图法。超时法是:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。超时法实现简单,但有可能误判死锁,事务因其他原因长时间等待超过时限时,系统会误认为发生了死锁。

11、假设时限设置得太长,又不能及时发现死锁发生。DBMS并发控制子系统检测到死锁后,就要设法解除。通常采用的方法是选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的所有锁,使其他事务得以继续运行下去。当然,对撤销的事务所执行的数据修改操作必须加以恢复。12.什么样的并发调度是正确的调度答:可串行化(Sertalizable)的调度是正确的调度。可串行化的调度的定义:多个事务的并发执行是正确的,当且仅当其结果与按*一次序串行执行它们时的结果一样,称这种调度策略为可串行化的调度。13.设T1,T2,T3是如下的3个事务:T1:A:=A+2;T2:A:=A*2;T3:A:=A*2;设A的初值为0

12、。(1)假设这3个事务允许并行执行,则有多少可能的正确结果,请一一列举出来。答:A的最终结果可能有2、4、8、16。因为串行执行次序有T1 T2 T3、T1 T3 T2、T2 T1 T3、T2 T3 T1、T3 T1 T2、T3 T2 T1。对应的执行结果是16、8、4、2、4、2。(2)请给出一个可串行化的调度,并给出执行结果答:T1 T2 T3slock AY=A=OUnlock A*lock ASlock AA=Y+2等待写回 A(=2)等待Unlock A等待 Y=A=2 Unlock A *lock A Slock A A=Y*2 等待写回 A(=4)等待Unlock A等待Y=A=

13、4Unlock A*lock A写回 A(=16)Unlock A最后结果A为16,是可串行化的调度。(3)请给出一个非串行化的调度,并给出执行结果。答: T1 T2 T3Slock AY=A=0Unlock ASlock AY=A=0*lock A等待Unlock AA=Y+2写回 A(=2) Slock AUnlock A等待Y=A=2Unlock A*lock A *lock A等待 A=Y*2等待写回 A(=4)等待Unlock AA=Y*2写回 A(=0)Unlock A最后结果 A 为 0, 为非串行化的调度。(4)假设这3个事务都遵守两段锁协议,请给出一个不产生死锁的可串行化调度

14、。答: T1 T2 T3 Slock AY=A=O*lock AA=Y+2 Slock A写回 A(=2) 等待Unlock A 等待 Y=A=2 *lock A等待 Slock A A=Y*2 等待写回A(=4) 等待 Unlock A 等待 Y=A=4 *lock A A=Y*2写回 A(=16) Unlock A(5)假设这3个事务都遵守两段锁协议,请给出一个产生死锁的调度。答:T1 T2 T3Slock A Y=A=0Slock A Y=A=0*lock A等待 *lock A等待Slock A Y=A=0*lock A等待14.试述两段锁协议的概念。答:两段锁协议是指所有事务必须分两

15、个阶段对数据项加锁和解锁。在对任何数据进展读、写操作之前,首先要申请并获得对该数据的封锁;在释放一个封锁之后,事务不再申请和获得任何其他封锁。两段的含义是,事务分为两个阶段:第一阶段是获得封锁,也称为扩展阶段,在这阶段,事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁;第二阶段是释放封锁,也称为收缩阶段,在这阶段,事务释放已经获得的锁,但是不能再申请任何锁。15.试证明,假设并发事务遵守两段锁协议,则对这些事务的并发调度是可串行化的。证明:首先以两个并发事务T1和T2为例,存在多个并发事务的情形可以类推。根据可串行化定义可知,事务不可串行化只可能发生在以下两种情况:(1)事务T1

16、写*个数据对象A,T2读或写A;(2)事务Tl读或写*个数据对象A,T2写A。下面称A为潜在冲突对象。设T1和T2访问的潜在冲突的公共对象为A1,A2,An。不失一般性,假设这组潜在冲突对象中*=A1,A2, ,Ai均符合情况(1)。Y=Ai+1,An符合所情况(2)。*,T1需要*1ock *T2需要Slock * 或 *lock *1) 1)如果操作先执行,则T1获得锁,T2等待由于遵守两段锁协议,T1在成功获得*和Y中全部对象及非潜在冲突对象的锁后,才会释放锁。这时如果w*或Y,T2已获得w的锁,则出现死锁;否则,T1在对*、Y中对象全部处理完毕后,T2才能执行。这相当于按T1、T2的顺序串行执行,根据可串行化定义,T1和T2的调度是可串行化的。2) 2)操作先执行的情况与(1)对称因此,假设并发事务遵守两段锁协议,在不发生死锁的情况下,对这些事务的并发调度一定是可串行化的。证毕。16.举例说明,对并发事务的一个调度是可串行化的,而这些并发事务不一定遵守两段锁协议。Tl T2slock B读B=2 Y=B Unlock B*lock A Slock AA=Y+1 等待写回 A=3等待Unlock A 等待

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号