数据库系统概论CH部分习题解答.doc
《数据库系统概论CH部分习题解答.doc》由会员分享,可在线阅读,更多相关《数据库系统概论CH部分习题解答.doc(6页珍藏版)》请在冰点文库上搜索。
第十一章并发控制
事务处理技术主要包括数据库恢复技术和并发控制技术。
本章讨论数据库并发控制的基本概念和实现技术。
本章内容有一定的深度和难度。
读者学习本章一定要做到概念清楚。
一、基本知识点
数据库是一个共享资源,当多个用户并发存取数据库时就会产生多个事务同时存取同一个数据的情况。
若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性。
所以DBMS必须提供并发控制机制。
并发控制机制的正确性和高效性是衡量一个DBMS性能的重要标志之一。
①需要了解的:
数据库并发控制技术的必要性,活锁死锁的概念。
②需要牢固掌握的:
并发操作可能产生数据不一致性的情况(丢失修改、不可重复读、读“脏数据”)及其确切含义;封锁的类型;不同封锁类型的(例如X锁,S锁)的性质和定义,相关的相容控制矩阵;封锁协议的概念;封锁粒度的概念;多粒度封锁方法;多粒度封锁协议的相容控制矩阵。
③需要举一反三的:
封锁协议与数据一致性的关系;并发调度的可串行性概念;两段锁协议与可串行性的关系;两段锁协议与死锁的关系。
④难点:
两段锁协议与串行性的关系;与死锁的关系;具有意向锁的多粒度封锁方法的封锁过程。
二、习题解答和解析
1.在数据库中为什么要并发控制?
并发控制技术能保证事务的哪些特性?
答
数据库是共享资源,通常有许多个事务同时在运行。
当多个事务并发地存取数据库时就会产生同时读取和/或修改同一数据的情况。
若对并发操作不加控制就可能会存取和存储不正确的数据,破坏事务的一致性和数据库的一致性。
所以数据库管理系统必须提供并发控制机制。
并发控制技术能保证事务的隔离性和一致性。
2.并发操作可能会产生哪几类数据不一致?
用什么方法能避免各种不一致的情况?
答
并发操作带来的数据不一致性包括三类:
丢失修改、不可重复读和读“脏”数据。
(1)丢失修改(LostUpdate)
两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了(覆盖了)T1提交的结果,导致T1的修改被丢失。
(2)不可重复读(Non-RepeatableRead)
不可重复读是指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。
(3)读“脏”数据(DirtyRead)
读“脏”数据是指事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据就为“脏”数据,即不正确的数据。
避免不一致性的方法和技术就是并发控制。
最常用的技术是封锁技术。
也可以用其他技术,例如在分布式数据库系统中可以采用时间戳方法来进行并发控制。
3.什么是封锁?
基本的封锁类型有几种?
试述它们的含义。
答
封锁就是事务T在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。
加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新此数据对象。
封锁是实现并发控制的一个非常重要的技术。
基本的封锁类型有两种:
排它锁(ExclusiveLocks,简称X锁)和共享锁(ShareLocks,简称S锁)。
排它锁又称为写锁。
若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。
这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。
共享锁又称为读锁。
若事务T对数据对象A加上S锁,则事务T可以读A但不能修改A,其他事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。
这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。
4.如何用封锁机制保证数据的一致性?
答
DBMS在对数据进行读、写操作之前首先对该数据执行封锁操作,例如下图中事务T1在对A进行修改之前先对A执行Xlock(A),即对A加X锁。
这样,当T2请求对A加X锁时就被拒绝,T2只能等待T1释放A上的锁后才能获得对A的X锁,这时它读到的A是T1更新后的值,再按此新的A值进行运算。
这样就不会丢失T1的更新。
DBMS按照一定的封锁协议,对并发操作进行控制,使得多个并发操作有序地执行,就可以避免丢失修改、不可重复读和读“脏”数据等数据不一致性。
8.什么样的并发调度是正确的调度?
答
可串行化(Serializable)的调度是正确的调度。
可串行化的调度的定义:
多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行执行它们时的结果相同,称这种调度策略为可串行化的调度。
15.理解并解释下列术语的含义:
封锁、活锁、死锁、排它锁、共享锁、并发事务的调度、可串行化的调度、两段锁协议。
答
(略,请参考教材解答)
补充习题(参考资料)
16.什么是封锁协议?
不同级别的封锁协议的主要区别是什么?
答
在运用封锁技术对数据加锁时,要约定一些规则。
例如,在运用X锁和S锁对数据对象加锁时,要约定何时申请X锁或S锁、何时释放封锁等。
这些约定或者规则称为封锁协议(LockingProtocol)。
对封锁方式约定不同的规则,就形成了各种不同的封锁协议。
不同级别的封锁协议的主要区别在于什么操作需要申请封锁,何时申请封锁以及何时释放锁(即持锁时间的长短)。
一级封锁协议:
事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。
二级封锁协议:
一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。
三级封锁协议:
一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。
17.不同封锁协议与系统一致性级别的关系是什么?
答
不同的封锁协议对应不同的一致性级别。
一级封锁协议可防止丢失修改,并保证事务T是可恢复的。
在一级封锁协议中,对读数据是不加S锁的,所以它不能保证可重复读和不读“脏”数据。
二级封锁协议除防止了丢失修改,还可进一步防止读“脏”数据。
在二级封锁协议中,由于读完数据后立即释放S锁,所以它不能保证可重复读。
在三级封锁协议中,无论是读数据还是写数据都加长锁,即都要到事务结束时才释放封锁。
所以三级封锁协议除防止了丢失修改和不读“脏”数据外,还进一步防止了不可重复读。
下面的表格清楚地说明了封锁协议与系统一致性的关系。
X锁
S锁
一致性保证
操作结束释放
事务结束 释放
操作结束 释放
事务结束释放
不丢失修改
不读“脏”数据
可重复读
一级封锁协议
√
√
二级封锁协议
√
√
√
√
三级封锁协议
√
√
√
√
√
18.什么是活锁?
什么是死锁?
答
如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。
T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。
然后T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求……T2有可能永远等待,这就是活锁的情形。
活锁的含义是该等待事务等待时间太长,似乎被锁住了,实际上可能被激活。
如果事务T1封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,因T2已封锁了R2,于是T1等待T2释放R2上的锁。
接着T2又申请封锁R1,因T1已封锁了R1,T2也只能等待T1释放R1上的锁。
这样就出现了T1在等待T2,而T2又在等待T1的局面,T1和T2两个事务永远不能结束,形成死锁。
T1T2
LockR1.
.LockR2
..
LockR2.
等待.
等待LockR1
等待等待
19.试述活锁的产生原因和解决方法。
答
活锁产生的原因:
当一系列封锁不能按照其先后顺序执行时,就可能导致一些事务无限期等待某个封锁,从而导致活锁。
避免活锁的简单方法是采用先来先服务的策略。
当多个事务请求封锁同一数据对象时,封锁子系统按请求封锁的先后次序对事务排队,数据对象上的锁一旦释放就批准申请队列中第一个事务获得锁。
20.请给出预防死锁的若干方法。
答
在数据库中,产生死锁的原因是两个或多个事务都已封锁了一些数据对象,然后又都请求已被其他事务封锁的数据加锁,从而出现死等待。
防止死锁的发生其实就是要破坏产生死锁的条件。
预防死锁通常有两种方法:
(1)一次封锁法,要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行;
(2)顺序封锁法,预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。
21.请给出检测死锁发生的一种方法,当发生死锁后如何解除死锁?
答
数据库系统一般采用允许死锁发生,DBMS检测到死锁后加以解除的方法。
DBMS中诊断死锁的方法与操作系统类似,一般使用超时法或事务等待图法。
超时法是:
如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。
超时法实现简单,但有可能误判死锁,事务因其他原因长时间等待超过时限时,系统会误认为发生了死锁。
若时限设置得太长,又不能及时发现死锁发生。
DBMS并发控制子系统检测到死锁后,就要设法解除。
通常采用的方法是选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的所有锁,使其他事务得以继续运行下去。
当然,对撤销的事务所执行的数据修改操作必须加以恢复。
22.试述两段锁协议的概念。
答
两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁。
·在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁;
·在释放一个封锁之后,事务不再申请和获得任何其他封锁。
“两段”的含义是,事务分为两个阶段:
第一阶段是获得封锁,也称为扩展阶段,在这阶段,事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁;
第二阶段是释放封锁,也称为收缩阶段,在这阶段,事务释放已经获得的锁,但是不能再申请任何锁。
23.举例说明,对并发事务的一个调度是可串行化的,而这些并发事务不一定遵守两段锁协议。
T1 T2
SlockB
读B=2
Y=B
UnlockB
XlockA
SlockA
A=Y+1等待
写回A=3 等待
UnlockA等待
等待
SlockA
读A=3
X=A
UnlockA
XlockB
B=X+1
写回B=4
UnlockB
24.为什么要引进意向锁?
意向锁的含义是什么?
答
引进意向锁是为了提高封锁子系统的效率。
该封锁子系统支持多种封锁粒度。
原因是:
在多粒度封锁方法中一个数据对象可能以两种方式加锁——显式封锁和隐式封锁。
因此系统在对某一数据对象加锁时不仅要检查该数据对象上有无(显式和隐式)封锁与之冲突,还要检查其所有上级结点和所有下级结点,看申请的封锁是否与这些结点上的(显式和隐式)封锁冲突,显然,这样的检查方法效率很低。
为此引进了意向锁。
意向锁的含义是:
对任一结点加锁时,必须先对它的上层结点加意向锁。
例如事务T要对某个元组加X锁,则首先要对关系和数据库加IX锁。
换言之,对关系和数据库加IX锁,表示它的后裔结点——某个元组拟(意向)加X锁。
引进意向锁后,系统对某一数据对象加锁时不必逐个检查与下一级结点的封锁冲突了。
例如,事务T要对关系R加X锁时,系统只要检查根结点数据库和R本身是否已加了不相容的锁(如发现已经加了IX,则与X冲突),而不再需要搜索和检查R中的每一个元组是否加了X锁或S锁。
25.试述常用的意向锁:
IS锁、IX锁、SIX锁,给出这些锁的相容矩阵。
答
IS锁
如果对一个数据对象加IS锁,表示它的后裔结点拟(意向)加S锁。
例如,要对某个元组加S锁,则要首先对关系和数据库加IS锁
IX锁
如果对一个数据对象加IX锁,表示它的后裔结点拟(意向)加X锁。
例如,要对某个元组加X锁,则要首先对关系和数据库加IX锁。
SIX锁
如果对一个数据对象加SIX锁,表示对它加S锁,再加IX锁,即SIX=S+IX。
相容矩阵
6