数据库十章作业答案.docx
- 文档编号:10810259
- 上传时间:2023-02-23
- 格式:DOCX
- 页数:9
- 大小:22.85KB
数据库十章作业答案.docx
《数据库十章作业答案.docx》由会员分享,可在线阅读,更多相关《数据库十章作业答案.docx(9页珍藏版)》请在冰豆网上搜索。
数据库十章作业答案
1.试述事务的概念及事务的4个特性。
答:
事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。
事务具有4个特性:
原子性(Atomicity)、一致性(consistency)、隔离性(Isolation)和持续性(Durability)。
这4个特性也简称为ACID特性。
原子性:
事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做。
一致性:
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
隔离性:
一个事务的执行不能被其他事务干扰。
即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
持续性:
持续性也称永久性(Perfnanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。
接下来的其他操作或故障不应该对其执行结果有任何影响。
2.为什么事务非正常结束时会影响数据库数据的正确性,请列举一例说明之。
答:
事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。
如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是不一致的状态。
例如某工厂的库存管理系统中,要把数量为Q的某种零件从仓库1移到仓库2存放。
则可以定义一个事务T,T包括两个操作;Ql=Ql一Q,Q2=Q2+Q。
如果T非正常终止时只做了第一个操作,则数据库就处于不一致性状态,库存量无缘无故少了Q。
3.数据库中为什么要有恢复子系统?
它的功能是什么?
答:
因为计算机系统中硬件的故障、软件的错误、操作员的失误以及恶意的破坏是不可避免的,这些故障轻则造成运行事务非正常中断,影响数据库中数据的正确性,重则破坏数据库,使数据库中全部或部分数据丢失,因此必须要有恢复子系统。
恢复子系统的功能是:
把数据库从错误状态恢复到某一已知的正确状态(亦称为一致状态或完整状态)。
4.数据库运行中可能产生的故障有哪几类?
哪些故障影响事务的正常执行?
哪些故障破坏数据库数据?
答:
数据库系统中可能发生各种各样的故障,大致可以分以下几类:
(1)事务内部的故障;
(2)系统故障;(3)介质故障;(4)计算机病毒。
事务故障、系统故障和介质故障影响事务的正常执行;介质故障和计算机病毒破坏数据库数据。
5.数据库恢复的基本技术有哪些?
答:
数据转储和登录日志文件是数据库恢复的基本技术。
当系统运行过程中发生故障,利用转储的数据库后备副本和日志文件就可以将数据库恢复到故障前的某个一致性状态。
6.数据库转储的意义是什么?
试比较各种数据转储方法。
答:
数据转储是数据库恢复中采用的基本技术。
所谓转储即DBA定期地将数据库复制到磁带或另一个磁盘上保存起来的过程。
当数据库遭到破坏后可以将后备副本重新装入,将数据库恢复到转储时的状态。
静态转储:
在系统中无运行事务时进行的转储操作,如上图所示。
静态转储简单,但必须等待正运行的用户事务结束才能进行。
同样,新的事务必须等待转储结束才能执行。
显然,这会降低数据库的可用性。
动态转储:
指转储期间允许对数据库进行存取或修改。
动态转储可克服静态转储的缺点,它不用等待正在运行的用户事务结束,也不会影响新事务的运行。
但是,转储结束时后援副本上的数据并不能保证正确有效。
因为转储期间运行的事务可能修改了某些数据,使得后援副本上的数据不是数据库的一致版本。
为此,必须把转储期间各事务对数据库的修改活动登记下来,建立日志文件(109file)。
这样,后援副本加上日志文件就能得到数据库某一时刻的正确状态。
转储还可以分为海量转储和增量转储两种方式。
海量转储是指每次转储全部数据库。
增量转储则指每次只转储上一次转储后更新过的数据。
从恢复角度看,使用海量转储得到的后备副本进行恢复一般说来更简单些。
但如果数据库很大,事务处理又十分频繁,则增量转储方式更实用更有效。
7.什么是日志文件?
为什么要设立日志文件?
答:
(1)日志文件是用来记录事务对数据库的更新操作的文件。
(2)设立日志文件的目的是:
进行事务故障恢复;进行系统故障恢复;协助后备副本进行介质故障恢复。
8.登记日志文件时为什么必须先写日志文件,后写数据库?
答:
把对数据的修改写到数据库中和把表示这个修改的日志记录写到日志文件中是两个不同的操作。
有可能在这两个操作之间发生故障,即这两个写操作只完成了一个。
如果先写了数据库修改,而在运行记录中没有登记这个修改,则以后就无法恢复这个修改了。
如果先写日志,但没有修改数据库,在恢复时只不过是多执行一次UNDO操作,并不会影响数据库的正确性。
所以一定要先写日志文件,即首先把日志记录写到日志文件中,然后写数据库的修改。
9.针对不同的故障,试给出恢复的策略和方法。
(即如何进行事务故障的恢复?
系统故障的恢复?
介质故障恢复?
)
答:
事务故障的恢复:
事务故障的恢复是由DBMSDBMs执行恢复步骤是:
自动完成的,对用户是透明的。
(1)反向扫描文件日志(即从最后向前扫描日志文件),查找该事务的更新操作;
(2)对该事务的更新操作执行逆操作,即将日志记录中“更新前的值”写入数据库;(3)继续反向扫描日志文件,做同样处理;(4)如此处理下去,直至读到此事务的开始标记,该事务故障的恢复就完成了。
系统故障的恢复:
系统故障可能会造成数据库处于不一致状态:
一是未完成事务对数据库的更新可能已写入数据库;二是已提交事务对数据库的更新可能还留在缓冲区,没来得及写入数据库。
因此恢复操作就是要撤销(UNDO)故障发生时未完成的事务,重做(REDO)已完成的事务。
系统的恢复步骤是:
(1)正向扫描日志文件,找出在故障发生前已经提交的事务队列(REDO队列)和未完成的事务队列(uNDO队列)。
(2)对撤销队列中的各个事务进行UNDO处理。
进行UNDO处理的方法是,反向扫描日志文件,对每个UNDO事务的更新操作执行逆操作,即将日志记录中“更新前的值”BeforeImage)写入数据库。
(3)对重做队列中的各个事务进行REDO处理。
进行REDO处理的方法是:
正向扫描日志文件,对每个REDO事务重新执行日志文件登记的操作。
即将日志记录中“更新后的值”Afte,Image)写入数据库。
介质故障的恢复:
介质故障是最严重的一种故障。
恢复方法是重装数据库,然后重做已完成的事务。
具体过程是:
(1)DBA装入最新的数据库后备副本(离故障发生时刻最近的转储副本),使数据库恢复到转储时的一致性状态;
(2)DBA装入转储结束时刻的日志文件副本;(3)DBA启动系统恢复命令,由DBMS完成恢复功能,即重做已完成的事务。
10.什么是检查点记录?
检查点记录包括哪些内容?
答:
检查点记录是一类新的日志记录。
它的内容包括:
①建立检查点时刻所有正在执行的事务清单
②这些事务的最近一个日志记录的地址。
11.具有检查点的恢复技术有什么优点?
试举一个具体的例子加以说明。
答
答:
利用日志技术进行数据库恢复时,恢复子系统必须搜索日志,确定哪些事务需要REDO,哪些事务需要uNDO。
一般来说,需要检查所有日志记录。
这样做有两个问题:
一是搜索整个日志将耗费大量的时间;二是很多需要REDO处理的事务实际上已经将它们的更新操作结果写到数据库中了,恢复子系统又重新执行了这些操作,浪费了大量时间。
检查点技术就是为了解决这些问题。
在采用检查点技术之前,恢复时需要从头扫描日志文件,而利用检查点技术只需要从T。
开始扫描日志,这就缩短了扫描日志的时间。
事务Tl的更新操作实际上已经写到数据库中了,进行恢复时没有必要再REDO处理,采用检查点技术做到了这一点。
12.试述使用检查点方法进行恢复的步骤。
答:
(1)从重新开始文件(见第11题的图)中找到最后一个检查点记录在日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录。
(2)由该检查点记录得到检查点建立时刻所有正在执行的事务清单ACTIVE一LIST。
这里建立两个事务队列:
1)UNDO一LIST:
需要执行undo操作的事务集合;2)REDO一LIST:
需要执行redo操作的事务集合。
把ACTIVE一LIST暂时放入UNDO一LIST队列,REDO队列暂为空。
3)从检查点开始正向扫描日志文件:
①如有新开始的事务T*,把T*暂时放入uNDO一LlsT队列;②如有提交的事务毛,把毛从UNDO一LIST队列移到REDO一LIST队列,直到日志文件结束;4)对UNDO一LIST中的每个事务执行UNDO操作,对REDO一LIST中的每个事务执行REDO操作。
13.什么是数据库镜像?
它有什么用途?
答:
数据库镜像即根据DBA的要求,自动把整个数据库或者其中的部分关键数据复制到另一个磁盘上。
每当主数据库更新时,DBMS自动把更新后的数据复制过去,即DBMS自动保证镜像数据与主数据的一致性。
数据库镜像的用途有:
一是用于数据库恢复。
当出现介质故障时,可由镜像磁盘继续提供使用,同时DBMS自动利用镜像磁盘数据进行数据库的恢复,不需要关闭系统和重装数据库副本。
二是提高数据库的可用性。
在没有出现故障时,当一个用户对某个数据加排它锁进行修改时,其他用户可以读镜像数据库上的数据,而不必等待该用户释放锁。
在数据库中为什么要并发控制?
答:
数据库是共享资源,通常有许多个事务同时在运行。
当多个事务并发地存取数据库时就会产生同时读取和/或修改同一数据的情况。
若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性。
所以数据库管理系统必须提供并发控制机制。
2.并发操作可能会产生哪几类数据不一致?
用什么方法能避免各种不一致的情况?
答:
并发操作带来的数据不一致性包括三类:
丢失修改、不可重复读和读“脏’夕数据。
(l)丢失修改(lostupdate)两个事务Tl和T2读入同一数据并修改,T2提交的结果破坏了(覆盖了)Tl提交的结果,导致Tl的修改被丢失。
(2)不可重复读(Non一RepeatableRead)不可重复读是指事务Tl读取数据后,事务几执行更新操作,使Tl无法再现前一次读取结果。
(3)读“脏”数据(DirtyRead)读“脏’夕数据是指事务Tl修改某一数据,并将其写回磁盘,事务几读取同一数据后,Tl由于某种原因被撤销,这时Tl已修改过的数据恢复原值,几读到的数据就与数据库中的数据不一致,则几读到的数据就为“脏”数据,即不正确的数据。
避免不一致性的方法和技术就是并发控制。
最常用的技术是封锁技术。
也可以用其他技术,例如在分布式数据库系统中可以采用时间戳方法来进行并发控制。
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在对数据进行读、写操作之前首先对该数据执行封锁操作,例如下图中事务Tl在对A进行修改之前先对A执行xock(A),即对A加x锁。
这样,当几请求对A加x锁时就被拒绝,几只能等待Tl释放A上的锁后才能获得对A的x锁,这时它读到的A是Tl更新后的值,再按此新的A值进行运算。
这样就不会丢失Tl的更新。
DBMS按照一定的封锁协议,对并发操作进行控制,使得多个并发操作有序地执行,就可以避免丢失修改、不可重复读和读“脏’夕数据等数据不一致性。
5.什么是活锁?
什么是死锁?
答:
如果事务Tl封锁了数据R,事务几又请求封锁R,于是几等待。
几也请求封锁R,当Tl释放了R上的封锁之后系统首先批准了几的请求,几仍然等待。
然后几又请求封锁R,当几释放了R上的封锁之后系统又批准了几的请求„„几有可能永远等待,这就是活锁的情形。
活锁的含义是该等待事务等待时间太长,似乎被锁住了,实际上可能被激活。
如果事务Tl封锁了数据Rl,几封锁了数据凡,然后Tl又请求封锁几,因几已封锁了几,于是Tl等待几释放几上的锁。
接着几又申请封锁Rl,因Tl已封锁了Rl,几也只能等待Tl释放Rl上的锁。
这样就出现了Tl在等待几,而几又在等待T}的局面,T}和几两个事务永远不能结束,形成死锁。
6.试述活锁的产生原因和解决方法。
答:
活锁产生的原因:
当一系列封锁不能按照其先后顺序执行时,就可能导致一些事务无限期等待某个封锁,从而导致活锁。
避免活锁的简单方法是采用先来先服务的策略。
当多个事务请求封锁同一数据对象时,封锁子系统按请求封锁的先后次序对事务排队,数据对象上的锁一旦释放就批准申请队列中第一个事务获得锁。
11.请给出检测死锁发生的一种方法,当发生死锁后如何解除死锁?
答:
数据库系统一般采用允许死锁发生,DBMS检测到死锁后加以解除的方法。
DBMS中诊断死锁的方法与操作系统类似,一般使用超时法或事务等待图法。
超时法是:
如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。
超时法实现简单,但有可能误判死锁,事务因其他原因长时间等待超过时限时,系统会误认为发生了死锁。
若时限设置得太长,又不能及时发现死锁发生。
DBMS并发控制子系统检测到死锁后,就要设法解除。
通常采用的方法是选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的所有锁,使其他事务得以继续运行下去。
当然,对撤销的事务所执行的数据修改操作必须加以恢复。
12.什么样的并发调度是正确的调度?
答:
可串行化(Serializable)的调度是正确的调度。
可串行化的调度的定义:
多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行执行它们时的结果相同,称这种调度策略为可串行化的调度。
9.设Tl,几,几是如下的3个事务:
Tl:
A:
=A+2;
T2:
A:
=A*2;
T3:
A:
=A**2;(A<-A*A)
设A的初值为0。
(l)若这3个事务允许并行执行,则有多少可能的正确结果,请一一列举出来。
答:
A的最终结果可能有2、4、8、16。
因为串行执行次序有TlT2T3、TlT3T2、T2T1T3、T2T3Tl、T3T1T2、T3T2Tl。
对应的执行结果是16、8·4·2·4·2。
(2)请给出一个可串行化的调度,并给出执行结果
答:
最后结果A为16,是可串行化的调度。
(3)请给出一个非串行化的调度,并给出执行结果。
答:
最后结果A为0,为非串行化的调度。
(4)若这3个事务都遵守两段锁协议,请给出一个不产生死锁的可串行化调度。
答:
(5)若这3个事务都遵守两段锁协议,请给出一个产生死锁的调度。
答:
11.试证明,若并发事务遵守两段锁协议,则对这些事务的并发调度是可串行化的。
证明:
首先以两个并发事务Tl和T2为例,存在多个并发事务的情形可以类推。
根据可串行化定义可知,事务不可串行化只可能发生在下列两种情况:
(l)事务Tl写某个数据对象A,T2读或写A;
(2)事务Tl读或写某个数据对象A,T2写A。
下面称A为潜在冲突对象。
设Tl和T2访问的潜在冲突的公共对象为{A1,A2„,An}。
不失一般性,假设这组潜在冲突对象中X=(A1,A2,„,Ai}均符合情况1。
Y={Ai+1,„,An}符合所情况
(2)。
VX∈x,Tl需要XlockX①
T2需要Slockx或Xlockx②
1)如果操作①先执行,则Tl获得锁,T2等待
由于遵守两段锁协议,Tl在成功获得x和Y中全部对象及非潜在冲突对象的锁后,才会释放锁。
这时如果存在w∈x或Y,T2已获得w的锁,则出现死锁;否则,Tl在对x、Y中对象全部处理完毕后,T2才能执行。
这相当于按Tl、T2的顺序串行执行,根据可串行化定义,Tl和几的调度是可串行化的。
2)操作②先执行的情况与(l)对称因此,若并发事务遵守两段锁协议,在不发生死锁的情况下,对这些事务的并发调度一定是可串行化的。
证毕。
12.举例说明,对并发事务的一个调度是可串行化的,而这些并发事务不一定遵守两段锁协议。
答:
13.为什么要引进意向锁?
意向锁的含义是什么?
答:
引进意向锁是为了提高封锁子系统的效率。
该封锁子系统支持多种封锁粒度。
原因是:
在多粒度封锁方法中一个数据对象可能以两种方式加锁―显式封锁和隐式封锁。
因此系统在对某一数据对象加锁时不仅要检查该数据对象上有无(显式和隐式)封锁与之冲突,还要检查其所有上级结点和所有下级结点,看申请的封锁是否与这些结点上的(显式和隐式)封锁冲突,显然,这样的检查方法效率很低。
为此引进了意向锁。
意向锁的含义是:
对任一结点加锁时,必须先对它的上层结点加意向锁。
例如事务T要对某个元组加X锁,则首先要对关系和数据库加ix锁。
换言之,对关系和数据库加ix锁,表示它的后裔结点―某个元组拟(意向)加X锁。
引进意向锁后,系统对某一数据对象加锁时不必逐个检查与下一级结点的封锁冲突了。
例如,事务T要对关系R加X锁时,系统只要检查根结点数据库和R本身是否已加了不相容的锁(如发现已经加了ix,则与X冲突),而不再需要搜索和检查R中的每一个元组是否加了X锁或S锁。
14.试述常用的意向锁:
IS锁、ix锁、SIX锁,给出这些锁的相容矩阵。
答:
IS锁:
如果对一个数据对象加IS锁,表示它的后裔结点拟(意向)加S锁。
例如,要对某个元组加S锁,则要首先对关系和数据库加IS锁
IX锁:
如果对一个数据对象加ix锁,表示它的后裔结点拟(意向功口X锁。
例如,要对某个元组加X锁,则要首先对关系和数据库加ix锁。
SIX锁:
如果对一个数据对象加SIX锁,表示对它加S锁,再加IX锁,即SIX=S+IX。
相容矩阵:
15.理解并解释下列术语的含义:
封锁、活锁、死锁、排它锁、共享锁、并发事务的调度、可串行化的调度、两段锁协议。
答:
(略,已经在上面有关习题中解答)
16.试述你了解的某一个实际的DBMS产品的并发控制机制。
答:
(略,参见简单介绍了有关Oracle的并发控制机制。
)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 作业 答案