免费智能真题库 > 历年试卷 > 信息系统管理工程师 > 2019年上半年 信息系统管理工程师 上午试卷 综合知识
  第16题      
  知识点:   并发控制   事务的并发控制   事务
  关键词:   共享锁   排它锁   数据        章/节:   系统配置和方法   数据库的管理与控制       

 
假设事务T1对数据D1加了共享锁,事务T2对数据D2加了排它锁,那么( )。
 
 
  A.  事务T2对数据D1加排它锁成功
 
  B.  事务T1对数据D2加共享锁成功,加排它锁失败
 
  C.  事务T1对数据D2加排它锁或共享锁都成功
 
  D.  事务T1对数据D2加排它锁或共享锁都失败
 
 
 

 
  第15题    2014年上半年  
   45%
数据库管理系统(DBMS)提供的数据定义语言的功能是(14)。某单位开发的信息系统要求:员工职称为“工程师”的月基本..
  第14题    2015年上半年  
   91%
某医院住院部设有病人关系R(住院号,姓名,性别,、科室号,病房,家庭住址),其中:“住院号”唯一标识关系R中的每..
  第9题    2011年上半年  
   23%
连接数据库过程中需要指定用户名和密码,这种安全措施属于(9)。
   知识点讲解    
   · 并发控制    · 事务的并发控制    · 事务
 
       并发控制
        数据库是一个共享资源,可供多个用户使用,允许多个用户同时使用的数据库系统称为多用户数据库系统。在单处理机系统中,事务的并行执行实际上是这些并行事务的并行操作轮流交叉运行;在多处理机系统中,每个处理机可以运行一个事务,多个处理机可以同时运行多个事务,实现多个事务真正的并行运行。本节讨论的是以单处理机系统为基础的,这些理论可以推广到多处理机的情况。
        当多个用户并发地存取数据库时就会产生多个事务同时存取同一数据的情况,若并发操作不加控制,就可能会存取和存储不正确的数据,破坏数据库的一致性。并发操作带来的数据不一致性包括三类:丢失修改、不可重复读和读“脏”数据。丢失修改是指两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。不可重复读是指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果,具体来讲还包括三种情况:①事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时得到与前一次不同的值;②事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当T1再次按相同的条件读取数据时发现某些记录已经消失了;③事务T1按一定条件从数据库中读取某些数据记录后,事务T2插入了一些记录,当T1再次按照相同条件读取数据时发现多了一些记录。读“脏”数据是指事务T1修改某一数据并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤销,这时T1修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,即T2读到了“脏”数据。
        (1)封锁。
        并发控制的主要技术是封锁,所谓封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求对其加锁,加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他事务不能更新此数据对象。
        基本的封锁类型有两种:排它锁(简称X锁)和共享锁(简称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做任何修改。
        (2)封锁协议。
        运用X锁和S锁这两种基本封锁时,还需要约定一些规则(例如何时申请X锁或者S锁、持锁时间、何时释放等),这些规则称为封锁协议。下面介绍的封锁协议对封锁方式规定不同的封锁规则,在不同程度上解决了对并发操作的不正确调度所带来的问题。
        一级封锁协议是:事务T在修改数据R之前必须先对其加上X锁,直到事务结束(包括正常结束和非正常结束)时才释放。一级封锁协议可防止丢失修改,并保证事务T是可恢复的。在这一级的封锁协议中,如果仅仅是读数据而不对其修改的话,是不需要加锁的,所以他不能保证可重复读和不读“脏”数据。
        二级封锁协议是:一级封锁协议加上事务T在读取数据R之前必须先对其加上S锁,读完后即可释放S锁。这就防止了丢失修改,还可以进一步防止读“脏”数据,但它不能保证可重复读。
        三级封锁协议是:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。这就防止了丢失修改和不读“脏数据”,还进一步防止了不可重复读。
        两段锁协议是:对任何数据进行读写之前必须对该数据加锁,在释放了一个封锁之后,事务不再申请和获得任何其他封锁。这就缩短了持锁时间,提高了并发性,同时解决了数据的不一致性。
        (3)活锁和死锁。
        举个例子来说明活锁的概念,如果事务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两个事务永远不能结束,这就形成了死锁。目前在数据库中解决死锁问题主要有两种方法,一个是采取一定的措施来预防死锁的发生,另一个是允许发生死锁,并采用一定手段定期诊断系统中是否有死锁,如果发现了死锁则立即解除掉。
        ①死锁的预防。
        死锁的预防通常有两种方法:一次封锁法和顺序封锁法。
        一次封锁法要求每个事务必须一次把所有要使用的数据全部加锁,否则就不能继续执行。这个方法虽然能够有效地防止死锁的发生,但是将全部要用到的数据加锁扩大了封锁的范围,降低了系统的并发度。此外,数据库中的数据不断变化,难以精确地确定每个事务要封锁的数据对象,为此只能扩大封锁范围并将所有可能要封锁的数据对象加锁,这就进一步降低了并发度。
        顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。例如在B树结构的索引中,可规定封锁的顺序必须是从根结点开始,然后是下一级的子女结点,逐级封锁。顺序封锁法可以有效地防止死锁,但也同样存在问题。第一,数据库系统中封锁的数据对象极多,并且随着数据的插入、删除等操作不断变化,维护这样的资源的封锁顺序非常困难;第二,事务很事先确定每个事务要封锁的全部对象,因此也就很难按规定的顺序施加封锁。
        因此在数据库中广为采用的预防死锁的策略并不很适合数据库的特点,而DBMS在解决死锁问题上普遍采用的是诊断并解除死锁的方法。
        ②死锁的诊断与解除。
        数据库系统中死锁的诊断与解除的方法与操作系统类似,一般使用超时法或事务等待图法。
        超时法是指如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。超时法实现起来很简单,但它的不足之处是:①可能会误判死锁,事务可能是因为其他原因而使等待时间超过时限,系统会误认为发生了死锁;②如果时限设得太长,死锁发生后就不能及时发现。
        事务等待图是一个有向图G=(T,U)。T为结点的集合,每个结点表示正在运行的事务,U为边的集合,每条边表示事务等待的情况。若T1等待T2,则T1和T2之间划一条从T1指向T2的有向边。事务等待图动态地反映了所有事务的等待情况。并发控制子系统周期地检测事务等待图,若发现图中存在回路,则表示系统中出现了死锁。
        DBMS的并发子系统一旦检测到系统中存在着死锁,就要设法解除。通常的办法是选择一个代价最小的事务将其撤销(恢复该事务所执行的数据修改操作),释放此事务持有的所有的锁,这样其他的事务就可以运行下去。
 
       事务的并发控制
        事务可以一个一个地串行执行,即每个时刻只有一个事务运行,其他事务必须等到这个事务结束以后方能运行。事务在执行过程中需要不同的资源,有时需要CPU,有时需要存取数据库,有时需要I/O,有时需要通信。如果事务串行执行,则许多系统资源将处于空闲状态。因此,为了充分利用系统资源发挥数据库共享资源的特点,应该允许多个事务并行地执行。在单处理机系统中,事务的并行执行实际上是这些并行事务的并行操作轮流交叉运行。这种并行执行方式称为交叉并发方式(Interleaved Concurrency)。当多个用户并发地存取数据库时就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性。所以数据库管理系统必须提供并发控制机制。并发控制机制是衡量一个数据库管理系统性能的重要标志之一。
        事务是并发控制的基本单位,保证事务ACID特性是事务处理的重要任务,而事务ACID特性可能遭到破坏的原因之一是多个事务对数据库的并发操作造成的。为了保证事务的隔离性和数据库的一致性,DBMS需要对并发操作进行正确调度。这些就是数据库管理系统中并发控制机制的责任。并发操作带来的数据不一致性包括三类。丢失修改、不可重复读和读“脏”数据。产生上述三类数据不一致性的主要原因是并发操作破坏了事务的隔离性。并发控制就是要用正确的方式调度并发操作,使一个用户事务的执行不受其他事务的干扰,从而避免造成数据的不一致性。
        封锁是实现并发控制的一个非常重要的技术。所谓封锁就是事务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锁之前不能对A做任何修改。
        尽管数据库系统中采取了各种保护措施来防止数据库的安全性和完整性被破坏,保证并发事务的正确执行,但是计算机系统中硬件的故障、软件的错误、操作员的失误以及恶意的破坏仍是不可避免的,这些故障轻则造成运行事务非正常中断,影响数据库中数据的正确性,重则破坏数据库,使数据库中全部或部分数据丢失,因此数据库管理系统必须具有把数据库从错误状态恢复到某一已知的正确状态(亦称为一致状态或完整状态)的功能,这就是数据库的恢复。恢复子系统是数据库管理系统的一个重要组成部分,而且还相当庞大,常常占整个系统代码的百分之十以上。数据库系统所采用的恢复技术是否行之有效,不仅对系统的可靠程度起着决定性作用,而且对系统的运行效率也有很大影响,是衡量系统性能优劣的重要指标。
        事务内部的故障有的是可以通过事务程序本身发现,有的是非预期的,不能由事务程序处理的。事务内部更多的故障是非预期的,是不能由应用程序处理的。如运算溢出、并发事务发生死锁而被选中撤销该事务、违反了某些完整性限制等。以后,事务故障仅指这类非预期的故障。
        事务故障意味着事务没有达到预期的终点(commit或者显式的rollback),因此,数据库可能处于不正确状态。恢复程序要在不影响其他事务运行的情况下,强行回滚(rollback)该事务,即撤销该事务已经做出的任何对数据库的修改,使得该事务好像根本没有启动一样。这类恢复操作称为事务撤销(undo)。
        发生系统故障时,一些尚未完成的事务的结果可能已送入物理数据库,从而造成数据库可能处于不正确的状态。为保证数据一致性,需要清除这些事务对数据库的所有修改。恢复子系统必须在系统重新启动时让所有非正常终止的事务回滚,强行撤销(undo)所有未完成事务。
        另一方面,发生系统故障时,有些已完成的事务可能有一部分甚至全部留在缓冲区,尚未写回到磁盘上的物理数据库中,系统故障使得这些事务对数据库的修改部分或全部丢失,这也会使数据库处于不一致状态,因此应将这些事务已提交的结果重新写入数据库。所以系统重新启动后,恢复子系统除需要撤销所有未完成事务外,还需要重做(redo)所有已提交的事务,以将数据库真正恢复到一致状态。
 
       事务
               概述
               事务(Transaction)是一系列的数据库操作,是数据库应用程序的基本逻辑单位,即应用程序对数据库的操作都应该以事务的方式进行。
               事务是一个操作序列,这些操作“要么都做,要么都不做”,是数据库环境中不可分割的逻辑工作单位。事务和程序是两个不同的概念,一般一个程序可包含多个事务。
               事务通常由数据库操纵语言或其他高级语言(如SQL、CoBOL、C、C++、Java等)书写的用户程序来实现。一个事务由应用程序的一组操作序列组成,它以BEGIN TRANSACTION语句开始,以END TRANSACTION结束语句。
               事务定义的语句如下:
               (1)BEGIN TRANSACTION:事务开始。
               (2)END TRANSACTION:事务结束。
               (3)COMMIT:事务提交。该操作表示事务成功地结束,它将通知事务管理器该事务的所有更新操作现在可以被提交或永久地保留。
               (4)ROLLBACK:事务回滚。该操作表示事务非成功地结束,它将通知事务管理器出故障了,数据库可能处于不一致状态,该事务的所有更新操作必须回滚或撤销。
               典型的例子是银行转账业务。对“从账户A转入账户B金额x元”业务,站在顾客角度来看,转账是一次单独操作;而站在数据库系统的角度它至少是由两个操作组成的,第一步从账户A减去x元,第二步给账户B加上x元。下面是银行转账事务的伪代码:
               
               SQL中事务的开始与结束
               SQL标准规定当一条SQL语句被执行,就隐式地开始了一个事务,SQL中的Commit work和Rollback work语句之一会结束一个事务。
               (1)Commit work:提交当前事务。这意味着将该事务所做的更新在数据库中永久保存。一旦事务被提交后,一个新的事务自动开始。
               (2)Rollback work:回滚当前事务。这意味着将撤销该事务对数据库的更新。这样,数据库恢复到该事务执行第一条语句之前的状态。
               需要注意的是,若事务已执行了Commit work,就不能用Rollback work来撤销。数据库系统能保证在发生诸如某条SQL语句错误、断电、系统崩溃的情况下,若事务还没有执行Commit work,则所造成的影响将被回滚。对断电、系统崩溃的情况,回滚是在系统重新启动时进行。
   题号导航      2019年上半年 信息系统管理工程师 上午试卷 综合知识   本试卷我的完整做题情况  
1 /
2 /
3 /
4 /
5 /
6 /
7 /
8 /
9 /
10 /
11 /
12 /
13 /
14 /
15 /
 
16 /
17 /
18 /
19 /
20 /
21 /
22 /
23 /
24 /
25 /
26 /
27 /
28 /
29 /
30 /
 
31 /
32 /
33 /
34 /
35 /
36 /
37 /
38 /
39 /
40 /
41 /
42 /
43 /
44 /
45 /
 
46 /
47 /
48 /
49 /
50 /
51 /
52 /
53 /
54 /
55 /
56 /
57 /
58 /
59 /
60 /
 
61 /
62 /
63 /
64 /
65 /
66 /
67 /
68 /
69 /
70 /
71 /
72 /
73 /
74 /
75 /
 
第16题    在手机中做本题