数据库 第八章 并发控制
第八章 数据库管理(部分)

三、SQL中的完整性约束
1. 域完整性规则:定义属性的取值范围―-属性值约束。 包括:域约束子句、非空值约束、基于属性的检查子句。
①用“CREATE DOMAIN”语句定义新的域,并可出现CHECK子句。
例:
定义一个新的域DEPT,可用下列语句实现:
DEPT CHAR(20) DEFAULT „计算机软件’
二、完整性规则的组成与分类
1、每个规则由三部分组成:
①什么时候使用规则进行检查(规则的“触发条件”);
②要检查什么样的错误( “ 约束条件”或“谓词”);
③若检查出错误,该怎样处理( “ELSE子句”,即违反时 要做的动作)。 2、在关系数据库中,完整性规则可分为三类: ①域完整性规则:定义属性的取值范围; ②基本表约束; ③断言。
CREATE DOMAIN
CONSTRAINT
VALID_DEPT
/*域约束名字*/
CHECK(VALUE IN („计算机科学与技术’,„计算机软件’)); 允许域约束上的CHECK子句中可以有任意复杂的条件表达式。
②非空值约束(NOT NULL) 例: SNO char(4) NOT NULL ③基于属性的检查子句(CHECK): 例:CHECK (GRADE IS NULL) OR (GRADE BRTWEEN 0 AND 100)
教学重点:
检查点技术
并发操作、封锁带来的若干问题,并发调度的可串行化。
SQL中完整性约束的实现:断言、触发器技术。 安全性中的授权语句。
§1
事务的概念
一、事务的定义 形成一个逻辑工作单元的数据库操作的汇集, 称为事务(transaction)。
例:在关系数据库中,一个事务可以是一条SQL语句、
数据库并发控制中的锁定与冲突解决

数据库并发控制中的锁定与冲突解决在数据库中,当多个用户同时访问和操作相同的数据时,可能会出现数据不一致的情况,这就是并发控制所需要解决的问题。
并发控制旨在确保在多个并发事务同时运行时,数据库的一致性、隔离性和原子性得到保证。
在并发控制中,锁定和冲突解决是常用的手段。
一、并发控制的需求数据库并发控制的主要需求包括以下几个方面:1. 数据一致性:保证并发事务对数据库的操作在完成后保持数据库的一致状态。
2. 隔离性:并发事务之间应该相互隔离,不能相互干扰和影响。
3. 原子性:事务中的操作应该作为一个不可分割的原子操作执行,要么全部成功,要么全部失败。
4. 并发性能:保证系统能够充分利用硬件资源,提高系统的并发处理能力。
二、锁定机制数据库中的锁定机制是实现并发控制的重要手段。
锁定机制通过对数据对象进行锁定或解锁,控制并发操作的访问和修改。
常见的锁定机制包括悲观锁和乐观锁。
1. 悲观锁悲观锁是一种保守的锁定机制,在事务操作之前,会对数据对象进行锁定,以防止其他并发事务对该数据对象进行修改和访问。
悲观锁适用于并发事务冲突严重的情况,但会导致系统性能下降。
悲观锁的实现方式有两种:共享锁和排他锁。
共享锁允许多个事务同时对同一数据对象进行读取操作,而排他锁则只允许一个事务对数据对象进行写入操作。
2. 乐观锁乐观锁是一种较为乐观的锁定机制,它认为并发事务之间的冲突较少,因此不会对数据对象进行锁定。
乐观锁主要通过版本控制来解决并发冲突问题。
乐观锁的实现方式通常是给每个数据记录添加一个版本号或时间戳。
当事务更新数据时,检查数据的版本号是否匹配,如果匹配则进行更新操作,否则表示数据已经被其他事务修改,需要进行相应的处理。
三、冲突解决策略冲突解决策略用于解决并发事务之间的冲突问题,保证数据库操作的正确性和一致性。
1. 两阶段锁定两阶段锁定是一种常用的冲突解决策略。
它分为两个阶段:锁定阶段和释放阶段。
在锁定阶段,事务获取所需的锁定,并保持锁定状态;在释放阶段,事务释放获取的锁定,其他事务则可以获取相应的锁定。
第八章分布式并发控制

第八章 分布式并发控制
两段封锁协议
两段封锁协议(2PL)是数据库系统中解决并发控 制的重要方法之一,保证事务的可串行性调度。 2PL的实现思想是将事务中的加锁操作和解锁操 作分两阶段完成,要求并发执行的多个事务要 在对数据操作之前进行加锁,且每个事务中的 所有加锁操作要在解锁操作以前完成。 两段封锁协议分为:
第八章 分布式并发控制
并发控制理论基础
事务执行过程的形式化描述
通常以串行化理论来检验并发控制方法的正确性。
依据串行化理论,在数据库上运行的一个事务的所有操作,按其性质分为 读和写两类。 一个事务Ti对数据项x的读操作和写操作记为Ri(x)和Wi(x)。
一个事务Ti所读取数据项的集合,称为Ti的读集,所写的数据项的集合,称 为写集,分别记为R(Ti)和W(Ti)。 设有事务T1,完成的操作如下:T1:x=x+1;y=y+1;则T1可表示为: T1 :R1(x) W1(x) R1(y) W1(y)。 读/写集分别是: R(T1)={x,y} W(T1)={x,y}
可见, H1为串行历程, H2为并行历程。
第八章 分布式并发控制
并发控制理论基础
集中式数据库的可串行化问题
无论在集中式数据库系统中,还是在分布式数据库系 统中,并发调度都要解决并发事务对数据库的冲 突操作问题,使冲突操作串行执行,非冲突操作 并发执行。 在分布式数据库系统中,事务是由分解为各个场地上 的子事务的执行实现的。因此,分布式事务之间 的冲突操作,就转化为了同一场地上的子事务之 间的冲突操作,分布式事务的可串行性调度也转 化为了子事务的可串行性调度问题。
第八章 分布式并发控制
基本概念
数据库并发控制例题

数据库并发控制例题摘要:一、数据库并发控制概述1.并发控制的目的2.并发控制的手段二、数据库并发控制的原理1.封锁技术2.时间序列控制3.乐观控制三、数据库并发控制的例题解析1.封锁技术例题2.时间序列控制例题3.乐观控制例题四、例题总结与展望正文:一、数据库并发控制概述在数据库系统中,为了提高系统的并发性能和事务处理能力,需要对多个事务同时访问共享数据进行控制,这就是数据库并发控制。
并发控制的主要目的是保证数据的一致性和完整性,防止数据冲突和脏读等现象。
实现并发控制的手段主要有封锁技术、时间序列控制和乐观控制等。
二、数据库并发控制的原理1.封锁技术:封锁技术是一种广泛应用于数据库并发控制的方法,通过对数据对象加锁来防止多个事务同时对同一数据进行修改,从而保证数据的一致性。
2.时间序列控制:时间序列控制是根据事务执行的时间顺序来控制并发访问。
该方法通过为事务分配优先级,按照优先级顺序执行事务,从而避免冲突。
3.乐观控制:乐观控制是一种基于事务提交前对数据所做的修改进行检测的方法。
事务在执行修改操作时,不加锁,而是在提交时检测是否与其他事务产生冲突,若检测到冲突,则回滚事务并重新执行。
三、数据库并发控制的例题解析1.封锁技术例题:假设一个数据库系统中有两个事务T1 和T2,T1 正在对数据A 进行修改,此时T2 也要对数据A 进行修改。
通过封锁技术,可以为数据A 加锁,使得T2 在T1 完成修改前无法对数据A 进行修改,从而避免冲突。
2.时间序列控制例题:假设一个数据库系统中有三个事务T1、T2 和T3,它们的优先级顺序为T1 > T2 > T3。
通过时间序列控制,可以按照优先级顺序执行事务,首先执行T1,然后执行T2,最后执行T3。
这样可以避免优先级较低的事务与优先级较高的事务产生冲突。
3.乐观控制例题:假设一个数据库系统中有两个事务T1 和T2,T1 正在对数据A 进行修改,此时T2 也要对数据A 进行修改。
简述数据库的并发控制概念以及并发控制的主要方法

简述数据库的并发控制概念以及并发控制的主要方法数据库的并发控制是指在多个用户同时访问数据库的情况下,确保数据的一致性和完整性。
并发控制的主要目标是在保证数据库事务的正确执行的同时,提高数据库系统的并发性能。
并发控制的概念:并发控制是指对同一资源的访问是受到一定的控制,以确保数据库的一致性和完整性。
在数据库系统中,多个用户可以同时执行事务,而这些事务可能会对数据库中的数据进行读取和修改操作。
并发控制机制必须保证多个事务对数据库的并发执行不会导致数据的不一致性和冲突。
并发控制的主要方法:1.锁定机制:锁定是指在事务执行期间,对被访问的数据进行加锁,以防止其他事务对该数据进行修改。
锁定机制可以分为共享锁(用于读操作)和排他锁(用于写操作)。
当事务需要对一些数据项进行读取或修改时,需要先获取相应的锁。
如果资源已经被其他事务锁定,则当前事务需要等待资源释放后才能继续执行。
2.时间戳机制:时间戳是给每个事务分配的一个唯一的标识,用来标记事务的开始时间或提交时间。
事务执行期间,每个事务所访问的数据都会被标记上时间戳,以记录事务对数据的读取和修改操作。
在并发执行时,系统可以根据时间戳的顺序来判断事务的串行执行顺序,从而避免冲突和不一致性。
3.多版本并发控制(MVCC):MVCC是在每个数据项上维护多个版本的数据,每个事务执行时,可以根据事务的时间戳或版本号来读取对应的数据版本。
MVCC对读取操作不加锁,只对写操作加锁,从而提高了并发性能。
当一个事务需要修改一些数据时,会生成新的数据版本,并将新版本的指针指向旧版本,这样其他事务可以继续读取旧版本的数据,不会被阻塞。
4.乐观并发控制:乐观并发控制假设在事务提交时不会发生冲突,因此不对数据进行加锁。
当事务提交时,系统会检查该事务对数据修改时是否发生冲突。
如果没有冲突,该事务的修改操作会被接受,否则会被回滚,重新执行。
除了以上主要的并发控制方法,还有一些辅助的并发控制技术,如死锁检测和恢复、并发控制粒度的调整、多级锁技术等。
数据库并发控制的主要方法

数据库并发控制的主要方法
数据库并发控制的主要方法包括以下几种:
1. 锁:数据库可以使用锁来避免多个事务同时访问同一数据。
当一个事务正在修改某个数据时,其他事务必须等待锁释放后才能访问该数据。
这种方式的优点是简单易用,但缺点是会延迟事务的执行。
2. 乐观锁:乐观锁是一种并发控制机制,它通过记录版本号来实现对数据的锁定。
当一个事务修改数据时,它将版本号设置为当前值,其他事务需要先查询数据的版本号,如果发现版本号不一致,则该事务将被阻塞,直到乐观锁被释放。
这种方式的优点是命中概率高,但需要额外维护版本号。
3. 序列化:序列化是一种高级的并发控制机制,它通过将所有事务的执行顺序执行同一个操作来实现高并发的控制。
当一个事务开始执行时,它需要等待其他所有事务都完成并释放锁,然后才能执行自己的操作。
这种方式的优点是可以保证数据的一致性,但需要更高的网络延迟和更高的开销。
4. 并发调度:数据库可以通过调整并发调度的策略来实现并发控制。
例如,数据库可以在多个事务同时执行时,优先处理较新的事务,以避免多个事务同时执行导致的数据不一致。
这种方式的优点是可以提高并发性能,但需要更高的编程技巧和经验。
在实际应用中,不同的方法需要根据具体情况进行选择。
例如,当并发量较低时,可以使用锁来控制并发,但当并发量较高时,序列化和并发调度可能更加有效。
此外,需要尽量避免使用单一的并发控制机制,以避免产生死锁等问题。
第八章 数据库并发控制练习和答案

第八章数据库并发控制一、选择题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要读AB、T1正在写A,T2也要写AC、T1正在读A,T2要写AD、T1正在读A,T2也要读A8。
如果有两个事务,同时对数据库中同一数据进行操作,不会引起冲突得操作就是() .A、一个就是DELETE,一个就是SELECTB、一个就是SELECT,一个就是DELETEC、两个都就是UPDATED、两个都就是SELECT9.在数据库系统中,死锁属于()。
A、系统故障B、事务故障C、介质故障D、程序故障二、简答题1、在数据库中为什么要并发控制?答:数据库就是共享资源,通常有许多个事务同时在运行。
当多个事务并发地存取数据库时就会产生同时读取与/或修改同一数据得情况.若对并发操作不加控制就可能会存取与存储不正确得数据,破坏数据库得一致性。
所以数据库管理系统必须提供并发控制机制。
2、并发操作可能会产生哪几类数据不一致?用什么方法能避免各种不一致得情况?答: 并发操作带来得数据不一致性包括三类:丢失修改、不可重复读与读“脏”数据.(1)丢失修改(LostUpdate)两个事务T1与T2读入同一数据并修改,T2提交得结果破坏了(覆盖了)T1提交得结果,导致T1得修改被丢失。
数据库并发控制的方法与原理

数据库并发控制的方法与原理数据库并发控制是数据库管理系统中一个重要的概念,它解决了当多个用户同时访问数据库时可能出现的数据冲突和一致性问题。
在并发环境下,如果多个用户对同一数据进行读写或写操作,就很容易导致数据的不一致性,因此需要使用并发控制方法来保证数据库操作的正确性和一致性。
一、并发控制的原理并发控制的目标是保证数据库的一致性、事务的隔离性和并发操作的正确性。
它主要通过锁和并发控制算法来实现。
并发控制的原理可以概括为以下几个方面:1. 锁机制:锁是最常用的并发控制方法之一。
它可以把数据对象加锁,使得其他用户无法同时访问该对象。
在事务进行读写操作前,必须先获得该数据对象的锁,并在事务结束后释放锁。
通过锁的协调和管理,可以保证并发操作的正确性和一致性。
2. 事务隔离级别:数据库系统通过设置事务的隔离级别来控制并发操作。
常见的隔离级别有四个:读未提交(Read Uncommitted)、读已提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。
不同的隔离级别对并发控制的方法和效果有一定的影响。
3. 事务调度算法:数据库系统中的并发控制器会对并发的事务进行调度和管理,以保证事务的正确执行和顺序。
事务调度算法包括优先级调度、等待图调度和时间戳调度等。
它们可以根据事务的需求和依赖关系来决定事务的执行顺序,并避免死锁等并发问题。
二、并发控制的方法在数据库管理系统中,有多种方法可以实现并发控制,下面介绍其中的一些常用方法:1. 两段锁定(Two-Phase Locking):这是最基本的锁方法之一。
该方法要求事务通过两个阶段进行操作:增长(Growing)阶段和收缩(Shrinking)阶段。
在增长阶段,事务只获取锁并可以对数据进行读取操作;在收缩阶段,事务只释放锁,不再获取新的锁。
通过严格控制锁的操作顺序和释放时机,可以避免死锁等并发问题。
2. 死锁检测与解决:死锁是一种并发控制中常见的问题,当多个事务相互等待锁时可能会发生。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据库第八章并发控制并发控制习题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) 丢失修改(Lost Update) 两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了(覆盖了)T1提交的结果,导致T1的修改被丢失。
(2) 不可重复读(Non-Repeatable Read) 不可重复读是指事务T1读取数据后,事务T2执行更新操作,使T1无法再现前一次读取结果。
不可以重复读包括三种情况:详见>8。
1(P266) (3) 读“脏” 数据(Dirty Read) 读“脏”数据是指事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1于某种原因被撤消,这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据就为“脏”数据,即不正确的数据。
避免不一致性的方法和技术就是并发控制。
最常用的技术是封锁技术。
也可以用其他技术,例如在分布式数据库系统中可以采用时间戳方法来进行并发控制。
.答:封锁就是事务T在对某个数据对象例如表。
记录等操作之前,先向系统发出请求。
对其加锁。
加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新此数据对象。
封锁是实现并发控制的一个非常重要的技术。
4.答:基本的封锁类型有两种:排它锁(Exclusive Locks,简称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的更新。
T1 1.Xlock A 2.获得读A=16 3.A =A-1 写回A=15 Commit Unlock A 4.5.Xlock A 等待等待等待等待获得Xlock A A=A-1 写回A=14 A=15 T2 Commit Unlock A DBMS按照一定的封锁协议,对并发操作进行控制,使得多个并发操作有序地执行,就可以避免丢失修改,不可重复读和读脏数据等数据不一致性6.答:在运用封锁技术对数据加锁时,要约定一些规则。
例如,在运用X锁和S锁对数据对象加锁时,要约定何时申请X锁或S锁,何时释放封锁等。
这些约定或者规则称为封锁协议(Locking Protocol)。
对封锁方式约定不同的规则,就形成了各种不同的封锁协议,不同级别的封锁协议。
例如>8。
3中介绍的三级封锁协议,三级封锁协议的主要区别在于什么操作需要申请封锁,何时申请封锁以及何时释放锁一级封锁协议:事务T在修改数据R 之前必须先对其加X锁,直到事务结束才释放。
二级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。
三级封锁协议:一级封锁协议加上事务T 在读取数据R之前必须先对其加S锁,直到事务结束才释放。
7.答:不同的封锁协议对应不同的一致性级别。
一级封锁协议可防止丢失修改,并保证事务T可恢复的。
在一级封锁协议中,对读数据是不加S锁的,所以它不能保证可重复读和不读“脏”数据。
二级封锁协议除防止了丢失修改,还可进一步防止“脏”脏数据。
在二级封锁协议中,S锁,所以它不能保证可重复读。
在三级封锁协议中,无论是读数据还是写数据都加长锁,即都要到事务结束时才释放封锁。
所以三级封锁协议除防止了丢失修改和不读“脏”数据外,还进一步防止了不可重复读。
下面的表格清楚地说明了封锁协议与系统一致性的关系。
X锁S锁一致性保证操作结束释放一级封锁协议二级封锁协议三级封锁协议事务结束释放√ √ √ 操作结束释放√ 事务结束释放√ 不丢失修改√ √ √ 不读“脏”数据√ √ 可重复读√8.答T1 Lock R 。
Unlock。
T2 。
lock R 等待等待等待等待等待等待等待T3 。
Lock R 。
Lock R 。
Lock R 。
T4 。
Lock R 等待等待等待Lock R 。
如果事务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两个事务永远不能结束,形成死锁。
T1 Lock R1。
Lock R2 等待等待等待T2 。
Lock R2 。
Lock R1 等待9.答:活锁产生的原因:当一系列封锁不能按照其先后顺序执行时,就可能导致一些事务无限期等待某个封锁,从而导致活锁。
避免活锁的简单方法是采用先来先服务的策略。
当多个事务请求封锁同一数据对象时,封锁子系统按请求的先后顺序对事务排队,数据对象上的锁一旦释放就批准申请队列中第一个事务获得锁。
.答:在数据中,产生死锁的原因是两个或多个事务都已封锁了一些数据对象,然后又都请求已被其他事务封锁的数据加锁,从而出现死锁等待。
防止死锁的发生其实就是要破坏产生死锁的条件。
预防死锁通常有两种方法。
一次封锁法,要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能执行;顺序封锁法,预先对数据对象规定一个封锁的顺序,所有事务都按这个顺序实行封锁。
不过,预防死锁的策略不大适合数据库系统的特点,具体原因可参考《概论》。
11.答:数据库系统一般采用允许死锁发生,DBMS检测死锁后加以解除的方法。
DBMS中诊断死锁的方法与操作系统类似,一般使用超时法或事务等待图法。
超时法是:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。
超时实现简单,但有可能误判死锁,事务因其他原因长时间等待超过时限时,系统会误认为发生了死锁。
若时限设置得太长,又不能及时发现死锁发生。
DBMS并发控制子系统检测到死锁后,就要设法解除。
通常采用的方法是选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的使用锁,使其他事务得以继续运行下去。
当然,对撤消的事务所执行的数据修改操作必须、加以恢复。
12.答:可串性化的调度是正确的调度。
可串性化的调度的定义:多个事务的并发执行是正确的,当且仅当其结果与按某一次串行执行它们时的结果相同,称这种调度策略为可串行化的调度。
13.答T1 Slock A Y=A=0 UnLock A Xlock A A=Y+2 写回A(=2) Unlock A T2Slock A 等待等待等待Y=A=2 Unlock A Xlock A A=Y+2 写回A(=4) UnLock A T3 Slock A 等待等待等待Y=A=4 Unlock A Xlock A A=Y*2 写回A(=16) UnLock A T1 T2T3 Slock A Y=A=0 UnLock A Xlock A 等待A=Y+2 写回A(=2) UnLock A Slock A Y=A=0 UnLock A Xlock A 等待等待等待A=Y*2 写回A(=0) Slock A 等待Y=A=2 UnLock A Xlock A Y=Y**2 写回A(=4) UnLock A Unlock A 最后结果A为0,为非串行化的调度。
答T1 Slock A Y=A=0 Xlock A A=Y+2 写回A(=2) UnLock A T2Slock A 等待等待Y=A+2 Xlock A 等待A=Y*2 写回A(=4) UnLock A UnLock A T3Slock A 等待等待等待Y=A=4 Xlock A A=Y**2 写回A(=16) UnLock A UnLockA T1Slock A Y=A=0 T2T3Xlock A等待Slock A Y=A=0 Xlock A 等待Slock A Y=A=0 Xlock A 等待14.答:两段锁协议是指所有事务必须分两个阶段对数据项加锁和解锁。