数据库系统概论习题集 第八章 数据库并发控制

第八章 数据库并发控制 

  一、选择题

  1. 为了防止一个用户的工作不适当地影响另一个用户,应该采取( ) 。

  A. 完整性控制 B. 访问控制

  C. 安全性控制 D. 并发控制

  2. 解决并发操作带来的数据不一致问题普遍采用( )技术。

  A. * B. 存取控制

  C. 恢复 D. 协商

  3. 下列不属于并发操作带来的问题是( )。

  A. 丢失修改 B. 不可重复读

  C. 死锁 D. 脏读

  4. DBMS普遍采用( )方法来保证调度的正确性 。

  A. 索引 B. 授权

  C. * D. 日志

  5.事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放,这是( ) 。

  A. 一级*协议 B. 二级*协议

  C. 三级*协议 D. 零级*协议

  6. 如果事务T获得了数据项Q上的排他锁,则T对Q( ) 。

  A. 只能读不能写 B. 只能写不能读

  C. 既可读又可写 D. 不能读也不能写

  7.设事务T1和T2,对数据库中地数据A进行操作,可能有如下几种情况,请问哪一种不会发生冲突操作( ) 。

  A. T1正在写A,T2要读A

  B. T1正在写A,T2也要写A

  C. T1正在读A,T2要写A

  D. T1正在读A,T2也要读A

  8.如果有两个事务,同时对数据库中同一数据进行操作,不会引起冲突的操作是( ) 。

  A. 一个是DELETE,一个是SELECT

  B. 一个是SELECT,一个是DELETE

  C. 两个都是UPDATE

  D. 两个都是SELECT

  9. 在数据库系统中,死锁属于( )。

  A. 系统故障 B. 事务故障

  C. 介质故障 D. 程序故障

  选择题答案:

   (1) D (2) A (3) C (4) C (5) A

   (6) C (7) D (8) D (9) B

 二、简答题

  1. 在数据库中为什么要并发控制?

  答: 数据库是共享资源,通常有许多个事务同时在运行。

  当多个事务并发地存取数据库时就会产生同时读取和/或修改同一数据的情况。若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性。所以数据库管理系统必须提供并发控制机制。

  2. 并发操作可能会产生哪几类数据不一致?用什么方法能避免各种不一致的情况?

  答: 并发操作带来的数据不一致性包括三类:丢失修改、不可重复读和读“脏”数据。

  (1)丢失修改(Lost Update)

  两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了(覆盖了)T1提交的结果,导致T1的修改被丢失。

  (2)不可重复读(Non-Repeatable Read)

  不可重复读是指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。

  (3)读“脏”数据(Dirty Read)

  读“脏”数据是指事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据就为“脏”数据,即不正确的数据。

  避免不一致性的方法和技术就是并发控制。最常用的并发控制技术是*技术。

  也可以用其他技术,例如在分布式数据库系统中可以采用时间戳方法来进行并发控制。

  3. 什么是*?

  答: *就是事务T在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新此数据对象。

  *是实现并发控制的一个非常重要的技术。

  4. 基本的*类型有几种?试述它们的含义。

  答: 基本的*类型有两种: 排它锁(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锁之前不能对A做任何修改。

 5. 什么是*协议?不同级别的*协议的主要区别是什么?

  答: 在运用*技术对数据加锁时,要约定一些规则。例如,在运用X锁和S锁对数据对象加锁时,要约定何时申请X锁或S锁、何时释放*等。这些约定或者规则称为*协议(Locking Protocol)。对*方式约定不同的规则,就形成了各种不同的*协议。不同级别的*协议,例如《概论》中介绍的三级*协议,三级协议的主要区别在于什么操作需要申请*,何时申请*以及何时释放锁(即持锁时间的长短)。

   一级*协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。

   二级*协议:一级*协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。

   三级*协议:一级*协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。

 6. 不同*协议与系统一致性级别的关系是什么?

  答: 不同的*协议对应不同的一致性级别。

  一级*协议可防止丢失修改,并保证事务T是可恢复的。在一级*协议中,对读数据是不加S锁的,所以它不能保证可重复读和不读“脏”数据。

   二级*协议除防止了丢失修改,还可进一步防止读“脏”数据。在二级*协议中,由于读完数据后立即释放S锁,所以它不能保证可重复读。

   在三级*协议中,无论是读数据还是写数据都加长锁,即都要到事务结束时才释放*。所以三级*协议除防止了丢失修改和不读“脏”数据外,还进一步防止了不可重复读。

    7. 试述活锁的产生原因和解决方法。

  答:

  活锁产生的原因:当一系列*不能按照其先后顺序执行时,就可能导致一些事务无限期等待某个*,从而导致活锁。

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

   8. 请给出预防死锁的若干方法。

  答:

  在数据库中,产生死锁的原因是两个或多个事务都已*了一些数据对象,然后又都请求已被其他事务*的数据加锁,从而出现死等待。

  防止死锁的发生其实就是要破坏产生死锁的条件。预防死锁通常有两种方法:

  (1)一次*法

  要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。

  (2)顺序*法

  预先对数据对象规定一个*顺序,所有事务都按这个顺序实行*。

  不过,预防死锁的策略不大适合数据库系统的特点。

    9. 请给出检测死锁发生的一种方法,当发生死锁后如何解除死锁?

  答:

  数据库系统一般采用允许死锁发生,DBMS检测到死锁后加以解除的方法。

  DBMS中诊断死锁的方法与操作系统类似,一般使用超时法或事务等待图法。

  超时法是:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。超时法实现简单,但有可能误判死锁,事务因其他原因长时间等待超过时限时,系统会误认为发生了死锁。若时限设置得太长,又不能及时发现死锁发生。

  DBMS并发控制子系统检测到死锁后,就要设法解除。通常采用的方法是选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的所有锁,使其他事务得以继续运行下去。当然,对撤销的事务所执行的数据修改操作必须加以恢复。

    10. 什么样的并发调度是正确的调度?

  答:

  可串行化(Serializable)的调度是正确的调度。

  可串行化的调度的定义:多个事务的并发执行是正确的,当且仅当其结果与按某一次序串行地执行它们时的结果相同,我们称这种调度策略为可串行化的调度。

    11. 试述两段锁协议的概念。

  答:

  两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁。

  · 在对任何数据进行读、写操作之前,首先要申请并获得对该数据的*;

  · 在释放一个*之后,事务不再申请和获得任何其他*。

  “两段”的含义是,事务分为两个阶段:

  第一阶段是获得*,也称为扩展阶段。在这阶段,事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁。

  第二阶段是释放*,也称为收缩阶段。在这阶段,事务释放已经获得的锁,但是不能再申请任何锁。

    12. 为什么要引进意向锁? 意向锁的含义是什么?

  答:

  引进意向锁是为了提高*子系统的效率。该*子系统支持多种*粒度。

  原因是:在多粒度*方法中一个数据对象可能以两种方式加锁—显式*和隐式*。因此系统在对某一数据对象加锁时不仅要检查该数据对象上有无(显式和隐式)*与之冲突;还要检查其所有上级结点和所有下级结点,看申请的*是否与这些结点上的(显式和隐式)*冲突;显然,这样的检查方法效率很低。为此引进了意向锁。

  意向锁的含义是:对任一结点加锁时,必须先对它的上层结点加意向锁。

   例如事务T要对某个元组加X锁,则首先要对关系和数据库加IX锁。换言之,对关系和数据库加IX锁,表示它的后裔结点—某个元组拟(意向)加X锁。

  引进意向锁后,系统对某一数据对象加锁时不必逐个检查与下一级结点的*冲突了。例如,事务T要对关系R加X锁时,系统只要检查根结点数据库和R本身是否已加了不相容的锁(如发现已经加了IX,则与X冲突),而不再需要搜索和检查R中的每一个元组是否加了X锁或S锁。

   13. 试述常用的意向锁:IS锁,IX锁,SIX锁,给出这些锁的相容矩阵。

  答:

  IS锁

  如果对一个数据对象加IS锁,表示它的后裔结点拟(意向)加S锁。例如,要对某个元组加S锁,则要首先对关系和数据库加IS锁

  IX锁

  如果对一个数据对象加IX锁,表示它的后裔结点拟(意向)加X锁。例如,要对某个元组加X锁,则要首先对关系和数据库加IX锁。

  SIX锁

  如果对一个数据对象加SIX锁,表示对它加S锁,再加IX锁,即SIX = S + IX。

  相容矩阵(略) 

  14. 理解并解释下列术语的含义:*,活锁,死锁,排它锁,共享锁,并发事务的调度,可串行化的调度,两段锁协议。

  答:(略,已经在上面有关习题中解答)

  *25. 试述你了解的某一个实际的DBMS产品的并发控制机制。

  答:(略,参见《概论》第8节,简单介绍了有关Oracle的并发控制机制。)

数据库系统概论习题集 第八章 数据库并发控制

上一篇:Oracle 修改dmp的表空间


下一篇:数据库系统概论习题集 第三章 SQL语言