数据库 第八章并发控制.docx

上传人:b****2 文档编号:13954236 上传时间:2023-06-19 格式:DOCX 页数:6 大小:20.26KB
下载 相关 举报
数据库 第八章并发控制.docx_第1页
第1页 / 共6页
数据库 第八章并发控制.docx_第2页
第2页 / 共6页
数据库 第八章并发控制.docx_第3页
第3页 / 共6页
数据库 第八章并发控制.docx_第4页
第4页 / 共6页
数据库 第八章并发控制.docx_第5页
第5页 / 共6页
数据库 第八章并发控制.docx_第6页
第6页 / 共6页
亲,该文档总共6页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

数据库 第八章并发控制.docx

《数据库 第八章并发控制.docx》由会员分享,可在线阅读,更多相关《数据库 第八章并发控制.docx(6页珍藏版)》请在冰点文库上搜索。

数据库 第八章并发控制.docx

数据库第八章并发控制

数据库第八章并发控制

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

  2.并发操作可能会产生哪几类数据不一致?

用什么方法能避免各种不一致的情况?

3.什么是封锁?

  4.基本的封锁类型有几种?

试述他们的含义。

5.如何用封锁机制保证数据的一致性?

  6.什么是封锁协议?

不同级别的封锁协议的主要区别是什么?

7.不同封锁协议与系统一致性级别的关系是什么?

8.什么是活锁?

什么是死锁?

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

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

  11.请给出预测死锁发生的一种方法,当发生死锁后如何接触死锁?

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

13.设T1,T2,T3是如下3个事务:

  T1:

A:

=A+2;T2:

A:

=A*2;  T3:

A:

=A**2;(A?

A2)设A的初值为0。

  若这3个事务允许并行执行,则有多少可能的正确结果,请一一列举出来。

请给出一个可串行化的调度,并给出执行结果。

请给出一个非串行化的调度,并给出执行结果。

若这3个事务都遵守两段锁协议,请给出一个不产生死锁的可串行化调度。

若这3个事务都遵守两段锁协议,请给出一个产生死锁的调度。

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

  15.试证明,若并发事务遵守两段锁协议,则对这些事务的并发调度是可串行化的16.举例说明,对并发事务的一个调度是可串行化的,而这些事务不一定遵守两段锁协议。

  17.为什么要引进意向锁?

意向锁的含义是什么?

  18.试述常用的意向锁:

IS锁、IX锁、SIX锁,给出这些锁的相容矩阵。

  19.理解并解释下列术语的含义:

封锁、活锁、死锁、排他锁、共享锁、并发事务的调度、可串行化的调度、两段锁协议。

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

参考答案  1.答:

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

  当多个事务并发地存取数据库时就会产生同时读取和/或修改同一数据的情况。

若对并发操作不加控制就可能会存取和存储不正确的数据,破坏数据库的一致性。

所以数据库管理系统必须提供并发控制机制。

  2.答:

并发操作带来的数据不一致性包括三类:

丢失修改,不可重复读和读“脏”数据。

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

  

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

不可以重复读包括三种情况:

详见>8。

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

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

最常用的技术是封锁技术。

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

  .答:

封锁就是事务T在对某个数据对象例如表。

记录等操作之前,先向系统发出请求。

对其加锁。

加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新此数据对象。

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

  4.答:

基本的封锁类型有两种:

排它锁(ExclusiveLocks,简称X锁)和共享锁。

  排它锁又成为写锁。

若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。

这就保证了其他事务在T释放A上的锁之前不能再读取和修改A。

  共享锁又称为读锁。

若事务Td对数据对象A加上s锁,则事务T可以读取A但不能修改A,其他事务只能再对A加S锁。

而不能加X锁,直到T释放A上的S锁。

这就保证了其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。

  5.答:

DBMS在对数据进行读,写操作之前首先对该数据执行封锁操作,例如下图中事务T1在对A进行修改之前先对A执行Xock(A),即对A加X锁。

这样,当T2请求对A加X锁时就被拒绝,T2只能等待T1释放A上的锁后才能获得对A的X锁,这时它读到的A是T1更新后的值,再按此新的A值进行运算。

这样就不会丢失T1的更新。

  T11.XlockA2.获得读A=163.A=A-1写回A=15CommitUnlockA4.5.  XlockA等待等待等待等待获得XlockAA=A-1写回A=14A=15T2CommitUnlockADBMS按照一定的封锁协议,对并发操作进行控制,使得多个并发操作有序地执行,就可以避免丢失修改,不可重复读和读脏数据等数据不一致性  6.答:

在运用封锁技术对数据加锁时,要约定一些规则。

例如,在运用X锁和S锁对数据对象加锁时,要约定何时申请X锁或S锁,何时释放封锁等。

这些约定或者规则称为封锁协议(LockingProtocol)。

对封锁方式约定不同的规则,就形成了各种不同的封锁协议,不同级别的封锁协议。

例如>8。

3中介绍的三级封锁协议,三级封锁协议的主要区别在于什么操作需要申请封锁,何时申请封锁以及何时释放锁  一级封锁协议:

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

二级封锁协议:

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

  三级封锁协议:

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

  7.答:

不同的封锁协议对应不同的一致性级别。

  一级封锁协议可防止丢失修改,并保证事务T可恢复的。

在一级封锁协议中,对读数据是不加S锁的,所以它不能保证可重复读和不读“脏”数据。

  二级封锁协议除防止了丢失修改,还可进一步防止“脏”脏数据。

在二级封锁协议中,  S锁,所以它不能保证可重复读。

  在三级封锁协议中,无论是读数据还是写数据都加长锁,即都要到事务结束时才释放封锁。

所以三级封锁协议除防止了丢失修改和不读“脏”数据外,还进一步防止了不可重复读。

下面的表格清楚地说明了封锁协议与系统一致性的关系。

  X锁  S锁  一致性保证操作结束释放一级封锁协议二级封锁协议三级封锁协议    事务结束释放√√√      操作结束释放√  事务结束释放√  不丢失修改√√√    不读“脏”数据√√  可重复读√  8.答T1LockR。

Unlock  。

  T2。

lockR等待等待等待等待等待等待等待T3。

LockR。

LockR。

LockR。

  T4。

LockR等待等待等待  LockR。

如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。

T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2人仍然等待。

  后T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求…  T2有可能永远等待,这就是活锁的情形。

活锁的含义是该等待事务等待时间太长,似乎被锁住了,实际上可能被激活。

  如果事务T1封锁了数据R1,T2封锁了数据R2,然后T1又请求封锁R2,因为已封锁了R2,于是T1等待t2释放r2上的锁。

接着T2又申请封锁R1,因T1已封锁了R1,T2也只能等待T1释放R1上的锁。

这样就出现了T1在等待T2,而T2又在等待T1的局面,T1和T2两个事务永远不能结束,形成死锁。

T1LockR1  。

  。

LockR2等待等待等待T2。

LockR2。

LockR1等待9.答:

活锁产生的原因:

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

  避免活锁的简单方法是采用先来先服务的策略。

当多个事务请求封锁同一数据对象时,封锁子系统按请求的先后顺序对事务排队,数据对象上的锁一旦释放就批准申请队列中第一个事务获得锁。

  .答:

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

  防止死锁的发生其实就是要破坏产生死锁的条件。

预防死锁通常有两种方法。

  一次封锁法,要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能执行;  顺序封锁法,预先对数据对象规定一个封锁的顺序,所有事务都按这个顺序实行封锁。

  不过,预防死锁的策略不大适合数据库系统的特点,具体原因可参考《概论》。

11.答:

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

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

  超时法是:

如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。

超时实现简单,但有可能误判死锁,事务因其他原因长时间等待超过时限时,系统会误认为发生了死锁。

若时限设置得太长,又不能及时发现死锁发生。

  DBMS并发控制子系统检测到死锁后,就要设法解除。

通常采用的方法是选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的使用锁,使其他事务得以继续运行下去。

当然,对撤消的事务所执行的数据修改操作必须、加以恢复。

12.答:

可串性化的调度是正确的调度。

  可串性化的调度的定义:

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

13.答  T1SlockAY=A=0UnLockAXlockAA=Y+2写回A(=2)UnlockAT2  SlockA等待等待等待Y=A=2UnlockAXlockAA=Y+2写回A(=4)UnLockAT3  SlockA等待等待等待Y=A=4UnlockAXlockAA=Y*2写回A(=16)UnLockA  T1T2  T3SlockAY=A=0UnLockA  XlockA等待A=Y+2写回A(=2)UnLockA  SlockAY=A=0UnLockA  XlockA等待等待等待A=Y*2写回A(=0)  SlockA等待Y=A=2UnLockAXlockAY=Y**2写回A(=4)UnLockAUnlockA最后结果A为0,为非串行化的调度。

答  T1SlockAY=A=0XlockAA=Y+2写回A(=2)UnLockA  T2  SlockA等待等待Y=A+2XlockA等待A=Y*2写回A(=4)UnLockAUnLockA  T3  SlockA等待等待等待Y=A=4XlockAA=Y**2写回A(=16)UnLockAUnLockA  T1  SlockA  Y=A=0  T2  T3

  

      XlockA  等待SlockAY=A=0XlockA等待  SlockAY=A=0XlockA等待  14.答:

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

在对任何数据进行读,写操作之前,首先要申请并获得对该数据的封锁;在释放一个封锁之后,事务不再申请和获得任何其他封锁。

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

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

15.证明:

  首先以两个并发事务T1和T2为例,存在多个并发事务的情形可以类推。

根据可串行化定义可知,事务不可串行化可能发生在下列两种情况:

事务T1写某个数据对象A,T2读或写A;事务T1读或写某个数据对象A,T2写A下面称A为潜在冲突对象。

  设T1和T2访问的潜在冲突的公共对象为{A1,A2,A3,……An}。

  不失一般性,假设这组潜在冲突对象中X={A1,A2,……,Ai}均符合情况1。

Y={Ai+1,………,An}符合所情况

(2)  ?

x∈X,T1需要Xlockx  T2需要Slockx或Xlockx  1)如果操作1先执行,则T1获得锁,T2等待  于遵守两段锁协议,T1在成功获得X和Y中全部对象及非潜在冲突对象的锁后,才会释放锁。

  这时如果?

w∈X或Y,T2已获得w的锁,则出现死锁;  否则,T1在对X,Y中的对象全部处理完毕后,T2才能执行。

  这相当于按T1,T2的顺序串行执行,根据可串行化定义,T1和T2的调度是可串行化的。

  16.答:

  T1  T2SlockB读B=2Y=BUnLockBXlockA  SlockAA=Y+1写回A=3UnLockA等待等待等待等待SlockA读A=3X=AUnLockAXlockBB=X+1写回B=4UnLockB17.答:

引进意向锁是为了提高封锁子系统的效率。

该封锁子系统支持多种封锁粒度。

原因是:

在多粒度封锁方法中一个数据对象可能以良种方式加锁---显式封锁和隐式封锁。

因此系统在对某一数据对象加锁时不仅要检查该数据对象上有无(显式和隐式)封锁与之冲突,还要检查其所有上级结点和所有下级结点,看申请的封锁是否与这些结点上的(显式和隐式)封锁冲突,显然,这样的检查方法效率很低。

为此引进了意向锁。

  意向锁的含义是:

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

  例如事务T要对某个元组加X锁,则首先要对关系和数据库加IX锁。

换言之,对关系和数据库加IX锁,表示它的后裔结点---某个元组拟加X锁。

  引进意向锁后,系统对某一数据对象加锁不必逐个检查与下一级结点的封锁冲突了。

例如,事务T要对关系R加X锁,系统只要检查根结点数据库和R本身是否已加了不相容的锁,而不再需要搜索和检查R中的每一个元组是否加了X锁或是S锁。

18.答:

IS锁  如果对一个数据对象加IS锁,表示它的后裔结点拟(意向)加S锁。

例如,要对某个元组加S锁,则要首先对关系和数据库加IX锁。

IX锁  如果对一个数据对象加IX锁,表示它的后裔结点拟(意向)加X锁。

例如,要对某个元组加X锁,则要首先对关系和数据库加IX锁。

SIX锁  如果对一个数据对象加SIX锁,表示对它加S锁,再加IX锁,即SIX=S+IX  T0T1SXISIXYNYNNNNNNYYNYYYYNNYYNYNNYNNYYYYYYYSXISIXSIX-SIXN-Y19.答:

20.答:

  

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2