21. 什么是游标?简述嵌入式SQL中引入游标的过程。
答:游标是系统为用户开设的一个数据缓冲区,存放SQL语句的执行结果。SQL语言是面向集合的,主语言是面向记录的,一组主变量一次只能存放一条记录,用户可以逐一从游标中获取记录,并赋给主变量,交由主语言进一步处理。
(1)先用游标定义语句DECLARE CURSOR将 SQL 游标与 SELECT 语句相关联。(2)用OPEN语句打开游标,执行 SELECT 语句,游标处于活动状态,此时游标指向查询结果第一个元组之前。(3)每执行一次FETCH语句,游标指向下一个元组,并把其值送到共享变量,供程序处理。如此重复,直至所有查询结果处理完毕。(4)最后用CLOSE语句关闭游标。关闭的游标可以被重新打开,与新的查询结果相联系,但在没有被打开前,不能使用。
22.简述事务的定义及其所具有的ACID特性。
答:事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位。事务具有四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持续性(Durability)。这个四个特性也简称为ACID特性。
1) 原子性:事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做。 2) 一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。 3) 隔离性:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。 4) 持续性:持续性也称永久性(Permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其执行结果有任何影响。 23.事务的COMMIT语句和ROLLBACK语句的功能是什么? 答:COMMIT语句表示事务执行成功地接结束(提交),此时告诉系统,DB要进入一个新的正确状态,该事务对DB的所有更新都已交付实施(写入磁盘)。
ROLLBACK语句表示事务执行不成功地结束(应该’回滚’)此时告诉系统,已发生错误,DB可能处在不正确的状态,该事务对DB的所有更新必须被撤消,DB应恢复该事务到初始状态。
24.为什么要设立日志文件?登记日志文件时为什么必须先写日志文件,后写数据库?
答:日志文件是用来记录事务对数据库的更新操作的文件,目的是进行事务故障恢复、系统故障恢复、协助后备副本进行介质故障恢复。日志文件中记载了事务开始标记、事务结束标记以及事务对DB的插入、删除和修改的每一次操作前后的值。
把数据的修改写到数据库和把对数据的修改操作写到日志文件是两个不同的操作,在两个操作之间可能会发生故障如果先写了数据库修改,而在日志文件中没有登记这个修改,在恢复的时候就无法恢复这个修改了;如果先写日志,但没有修改数据库,按日志恢复时只是多执行一次撤消操作,并不影响数据库的正确性,为了安全,一定要先写日志文件。
25.数据库在运行过程中可能产生的故障有哪几类? 答:(1)事务故障:事务在运行过程中由于种种原因,如输入数据的错误,运算溢出,违反了某些完整性限制,某些应用程序的错误,以及并行事务发生死锁等,使事务未能运行到正常中指点之前就被撤消了,这种情况称为’事务故障’。 (2)系统故障:系统鼓掌是指系统在运行过程中,由于某些原因,如OS和DBMS代码错误,操作员操作事务。特定类型的硬件错误(CPU故障),突然停电等造成系统停止运行,致使事务在执行过程中以非控方式中指。这时。内存中的信息丢失,而存储在外存储上的数据未受影响,这种情况称为’系统故障’。
(3)介质故障:系统在运行过程中,由于某种硬件故障,如磁盘损坏,磁头碰撞,或由于OS的某种潜在的错误。瞬间强磁场干扰,使存储在外存的数据部分损失或全部损失,称之为’介质故障’。
(4)计算机病毒:计算机病毒是一种人为的故障和破坏,它是一种计算机程序,通过读写染有病毒的计算机系统中的程序和数据这些病毒可以迅速繁殖和传播,危害计算机系统和数据库。 26.怎样进行事务故障的恢复
答:事务故障是指事务在运行至正常终止点前被中止,这时恢复子系统应利用日志文件撤消(UNDO)此事务已对数据库进行的修改。事务故障的恢复是由系统自动完成的,对用户是透明的。系统的恢复步骤是: (1)反向扫描文件日志(即从最后向前扫描日志文件),查找该事务的更新操作。
- 17 -
(2)对该事务的更新操作执行逆操作。即将日志记录中’更新前的值’写入数据库。这样,如果记录中是插入操作,则相当于做删除操作(因此时’更新前的值’为空)。若记录中是删除操作,则做插入操作,若是修改操作,则相当于用修改前值代替修改后值。
(3)继续反向扫描日志文件,查找该事务的其他更新操作,并做同样处理。 (4)如此处理下去,直至读到此事务的开始标记,事务故障恢复就完成了。 27.怎样进行系统故障的恢复?
答:系统故障造成数据库不一致状态的原因有两个,一是未完成事务对数据库的更新可能已写入数据库,二是已提交事务对数据库的更新可能还留在缓冲区没来得及写入数据库。因此恢复操作就是要撤消故障发生时未完成的事务,重做已完成的事务。
(1)正向扫描日志文件(即从头扫描日志文件),找出在故障发生前已经提交的事务(这些事务既有BEGIN TRANSACTION记录,也有COMMIT记录),将其事务标识记入重做(REDO)队列。同时找出故障发生时尚未完成的事务(这些事务只有BEGIN TRANSACTION记录,无相应的COMMIT记录),将其事务标识记入撤消(UNDO)队列。
(2)对撤消队列中的各个事务进行撤消(UNDO)处理。
进行UNDO处理的方法是,反向扫描日志文件,对每个UNDO事务的更新操作执行逆操作,即将日志记录中’更新前的值’写入数据库。
(3)对重做队列中的各个事务进行重做(REDO)处理。
进行REDO处理的方法是:正向扫描日志文件,对每个REDO事务重新执行日志文件登记的操作。即将日志记录中’更新后的值’写入数据库。 28.怎样进行介质故障的恢复?
答:发生介质故障后,磁盘上的物理数据和日志文件被破坏,恢复方法是重装数据库,然后重做已完成的事务。 (1)装入最新的数据库后备副本(离故障发生时刻最近的转储副本),使数据库恢复到最近一次转储时的一致性状态。对于动态转储的数据库副本,还须同时装入转储开始时刻的日志文件副本,利用恢复系统故障的方法(即REDO+UNDO),才能将数据库恢复到一致性状态。
(2)装入相应的日志文件副本(转储结束时刻的日志文件副本),重做已完成的事务。即: 首先扫描日志文件,找出故障发生时已提交的事务的标识,将其记入重做队列。
然后正向扫描日志文件,对重做队列中的所有事务进行重做处理。即将日志记录中’更新后的值’写入数据库。 29. 并发操作可能会产生哪几类数据不一致?用什么方法能避免各种不一致的情况? 答:并发操作带来的数据不一致性包括三类:丢失修改、不可重复读和读“脏”数据。 (1)丢失修改(Lost Update):两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了(覆盖了)T1提交的结果,导致T1的修改被丢失。
(2)不可重复读(Non-Repeatable Read):事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。
(3)读“脏”数据(Dirty Read):事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据就为“脏”数据,即不正确的数据。
避免不一致性的方法和技术就是并发控制。最常用的并发控制技术是封锁技术。
也可以用其他技术,例如在分布式数据库系统中可以采用时间戳方法来进行并发控制。 30.什么是封锁?基本的封锁类型有哪些?
答:封锁就是事务T在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新此数据对象。 封锁是实现并发控制的一个非常重要的技术。
基本的封锁类型有两种:排它锁(Exclusive Locks,简称X锁)和共享锁(Share Locks,简称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锁之
- 18 -
前不能对A做任何修改。
31.X封锁与S封锁有什么区别? 答:X锁与S锁的区别如图所示。 X锁 只允许一个事务独锁数据 获准X锁的事务可以修改数据 事务的并发度低 X锁必须保留到事务终点 解决’丢失更新’问题 S锁 允许多个事务并发S锁某一数据 获准S锁的事务只能读取数据,但不能修改数据 事务的并发度高,但增加了死锁的可能性 根据需要,可随时解除S锁 解决’读不一致性’问题 32.什么是活锁?试述活锁的产生原因和解决方法。 答:活锁产生的原因:当一系列封锁不能按照其先后顺序执行时,就可能导致一些事务无限期等待某个封锁,从而导致活锁。
避免活锁的简单方法是采用先来先服务的策略。当多个事务请求封锁同一数据对象时,封锁子系统按请求封锁的先后次序对事务排队,数据对象上的锁一旦释放就批准申请队列中第一个事务获得锁。 33.请给出检测死锁发生的方法,当发生死锁后如何解决死锁? 答:一般使用超时法或事务等待图法。 ①超时法
如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。超时法实现简单,但其不足也很明显。一是有可能误判死锁,事务因为其他原因使等待时间超过时限,系统会误认为发生了死锁。二是时限若设置得太长,死锁发生后不能及时发现。 ②等待图法
事务等待图是一个有向图G=(T,U)。 T为结点的集合,每个结点表示正运行的事务;U为边的集合,每条边表示事务等待的情况。若T1等待T2 ,则T1、T2之间划一条有向边,从T1指向T2。事务等待图动态地反映了所有事务的等待情况。并发控制子系统周期性地(比如每隔1分钟)检测事务等待图,如果发现图中存在回路,则表示系统中出现了死锁。
DBMS的并发控制子系统一旦检测到系统中存在死锁,就要设法解除。通常采用的方法是选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的所有的锁,使其它事务得以继续运行下去。当然,对撤消的事务所执行的数据修改操作必须加以恢复。
- 19 -
四、计算题
1.求关系运算结果:
3> 4
关系R A a1 a1 a2 a3 a4 a4 B b1 b2 b2 b3 b3 b4 C 3 6 5 11 4 7 关系S A a1 a2 a3 a4 B b1 b2 b3 b4 C 5 10 16 14 D 4 7 15 9 (1)R S(2)Π1,2,6,7 ( σ2=5(R×S) )
R.A R.B R.C S.A S.B S.C S.D a1 b2 6 a1 b1 5 4 a2 a3 a3 a3 a4 b2 b3 b3 b3 b4 5 11 11 11 7 a1 a1 a2 a4 a1 b1 b1 b2 b4 b1 5 5 10 14 5 4 4 7 9 4
R.A R.B S.C S.D a1 b1 5 4 a1 a2 a3 a4 a4 b2 b2 b3 b3 b4 10 10 16 16 14 7 7 15 15 9
2.求关系G和关系T自然连接及外连接的运算结果:
关系G
A B C
a1 b1 3
a1 b2 5
a2 b2 2
a3 b1 8
a4 b3 4
a4 b4 7
(1)自然连接:(2)左外连接: A a1 a2 a3 a4 B b1 b2 b1 b4 C 3 2 8 7 D d1 d1 d2 d1 E e1 e2 e2 e2 关系T B b1 b2 b2 b1 b4 C 3 4 2 8 7 D d1 d2 d1 d2 d1 E e1 e1 e2 e2 e2
A a1 a2 a3 a4 a1 a4 B b1 b2 b1 b4 b2 b3 C 3 2 8 7 5 4 D d1 d1 d2 d1 NULL NULL E e1 e2 e2 e2 NULL NULL
(3)右外连接:(4)全外连接:
- 20 -