收藏 分享(赏)

第五章 分布式数据库中的并发控制.ppt

上传人:hwpkd79526 文档编号:10070512 上传时间:2019-10-05 格式:PPT 页数:75 大小:521KB
下载 相关 举报
第五章  分布式数据库中的并发控制.ppt_第1页
第1页 / 共75页
第五章  分布式数据库中的并发控制.ppt_第2页
第2页 / 共75页
第五章  分布式数据库中的并发控制.ppt_第3页
第3页 / 共75页
第五章  分布式数据库中的并发控制.ppt_第4页
第4页 / 共75页
第五章  分布式数据库中的并发控制.ppt_第5页
第5页 / 共75页
点击查看更多>>
资源描述

1、一.并发控制的概念和原理 二.可串行化理论 三.分布式数据库系统并发控制的加锁技术 四.死锁管理 五.分布式数据库系统并发控制的时标技术 六.分布式数据库系统并发控制的乐观方法,第五章 分布式数据库中的并发控制(Concurrent Control),事务是访问数据库的逻辑工作单位,是一个操作序列,也是恢复处理和并发控制的基本单元。 事务具有ACID特性:原子性、一致性、隔离性、永久性 恢复管理机制负责保证事务的永久性和原子性; 并发控制机制负责保证事务的一致性和隔离性;,第五章 分布式数据库中的并发控制(Concurrent Control),一、并发控制的概念和原理,并发(能力):指多事务

2、在同一时间对相同数据同时访问(的能力)数据库的特点就是数据的集中管理和共享。通常总有若干事务在运行,这些事务可能并发存取相同的数据。事务的并发操作可以提高系统运行的效率,但这种并发功能也会对数据的一致性带来危险。试想:若有两个用户都试图访问某个银行用户的记录,同时要求修改该用户的存款余额,情况会怎样呢? 并发事务的冲突:(1)丢失更新(2)破坏完整性约束(3)不一致读,(1)丢失更新:一个用户(或事务)已完成的更新操作可能被另一个用户(或事务)更新操作所掩盖。,例:转帐事务T1:从帐号x中取100元,存入帐号y中。另一事务T2:向帐号中转入100元初始:帐号x中有100元,T1Begin Tr

3、ansaction T1read balance xbalancex=balancex-100if balancex0 thenbegin print insufficient fundsabort T1endwrite balancexread balanceybalancey=balancey+100write balanceyCommite T1,Value of balance x100 :100 :200 : :0,T2 Begin Transaction T2read xx=x+100write x Commit T2,Time,t0,t1,t2,t3,T2将x增至200元,却被T

4、1 将x减为0所掩盖 丢失更新问题,(2)破坏完整性约束(不一致分析):当两个事务并发执行时,会引起数据库的完整性约束被破坏问题。,例:surgen:记录外科医生有资格进行的手术,Schedule:哪个医生被安排在哪一天进行某种外科手术):,事务T3:将05.07.2003日的手术改为阑尾炎 Begin transaction T3Read Schedule where date= 05.07.2003Read Surgeon whereSurgeon.Surgeon.name=Schedule.Surgeon_nameand Surgeon.operation=“阑尾炎“If not fou

5、nd then abort T3Schedule.operation=“阑尾炎” Commit T3,T4:将05.07.2003日所有Tom有资格做的手术都交给他 Begin transaction T4Read Schedule where date=03-11-2002Read surgeonwhere Surgeon.Surgeon_name=Tomand Surgeon.operation=Schedule.operationIf not found then abort T3Schedule.Surgeon_name=Tom Commit T4,在T4查看手术安排时,事务T3还没有

6、将手术改为阑尾炎,所以事务T4认为Tom能完成当日的手术安排改为阑尾炎手术,这时,数据库的一致性被破坏。 两个事务并发执行后,Tom被安排于05.07.2003日进行他没有能力做的阑尾炎手术。,(3)不一致读问题读脏数据 “脏数据”:把未提交的随后又被撤消的更新数据称为“脏数据” 如果允许一个读事务读另一个正在执行却未完成的更新事务的结果,那么读取得结果可能是不正确的,即所谓的读脏数据或不一致读问题,T5: 更新事务Begin transaction T5read balancexbalancex= balancex-100if balancex0 thenbeginprint insuffi

7、cient fundsabort T5endwrite balancexrollback,T6:结算事务 begin transaction T6 sum=0do while not end_of_relationread balanceasum=sum+balancea.read balancexsum=sum+balancexread balanceysum=sum+balancey commit T6,例:一个结算事务(如财务统计)在执行时,出现一个更新事务(修改账目),则结算事务可能会得到不正确的结果,Time,Value of balance x100 : :0 : :100,t0,

8、t1,t2,讨论了当事务并发执行时可能出现的问题,一般的关系数据库都具有并发控制的能力,DBMS中具有并发控制机制,其控制算法的任务:合理安排这些事务的执行进程以避免冲突的出现。并发控制:指在用户数据修改的过程中保证该数据不被覆盖或改变的方式,也是指在多用户环境下,对 数据库并发操作进行规范的机制。其目的是为了避免对数据的丢失更新,读脏数据与破坏完整性约束等问题,从而保证数据的正确性与一致性。显然:如果DBMS在一个时间段内允许一个事务执行,即在允许下一个事务开始之前,当前事务必须提交,则不会出现并发控制的问题。但数据库系统的一个重要指标:查询的响应速度,要求并发执行程度的最大化。 因此:事务

9、要尽量的并发,而又不能出现相互间的冲突。 如何最大限度地开发事务执行的并发度,是近年来数据库技术研究的热点问题。,分布式数据库的并发控制,分布式事务是分布式操作的序列,被操作的数据分布在不同的站点上。(1)数据的分布对用户是透明的:用户应用对数据的请求是全局的、总体的;(2)允许数据在多个站点上有副本:数据更新时必须同时正确所有的副本。 分布式事务的并发控制,是DDBMS事务管理器的基本任务之一.并发控制就是负责正确协调并发事务的执行,保证这种并发的存取操作不致破坏数据库的完整性和一致性,确保并发执行的多个事务能够正确地运行并获得正确的结果。 分布式并发控制技术是以集中是数据库的并发控制技术为

10、基础,以串行化理论为基础,并针对分布式系统的特点扩展而来。对一组并发事务可能存在多种正确调度,分布式DBMS事务管理器的并发控制机制应采用代价最小的正确调度。,二. 可串行化理论,1、集中式系统的串行性问题:集中式数据库的并发控制以串行化理论为基础 (1)事务:按照串行化理论,一个在数据库上运行的事务的所有操作,按其性质分为读和写,事务是由一系列数据库的读、写操作组成的。 (2)调度表(Schedule):事务的一个操作序列,称之为一个调度或调度表也称历史。事务T1和T2的调度表为:S:R2(balancex),R1(balancex),W2(balancex),W1(balancex),R1

11、(balancey),W1(balancey)冲突操作:两个同时访问同一数据项balancex的操作,若其中至少有一个是写操作,则称这两个操作是冲突的注意:读操作不会相互冲突,只有读写冲突,写写冲突;两个操作可属于同一事务或者两个不同事务,在后者情况下,称为两个事务冲突,(3)串行调度,依次执行每一个事务的每一个读写操作,必定不会有冲突。 设有一组事务T=T1,T2,Tn,若事务Ti的所有操作都先于事务Tj,记为TiTj。 若一个调度S,其每个事务的执行均有TiTj,对所有的ij,记为:S=TiTj,则称S是一个串行调度 对一个串行调度来说,总可以正确执行,使数据库保持一致状态,因为: 若S正

12、确执行完成,则S中的每一个事务都被提交,由于事务的原子性,保证了数据库的一致性若S在执行时发生故障,若Tk之前的事务都已提交,则UNDO(Tk),使数据库的状态恢复到Tk前的状态。该状态的数据库是一致的,因Tk之前的事务都已提交;若S在执行时发生故障,若Tk之前的事务有被ABORT,则重做Tk以前已被提交的事务,撤销Tk以前夭折的事务,此时数据库也是一致的。 总可使数据库保持一致,但效率低,(4)可串行化调度:,从系统效率出发,希望一个调度中的各个事务是并发的,但这个调度等价于一个串行调度也就是说这个调度是可串行化的(Serializable) 如果将一个串行调度表S的读写顺序进行重排列,得到

13、一个新的调度表S,且S是与S 的执行结果相同,称S是与S等价的可串行调度表。 检验两个调度等价性的条件: 两个调度中,每个读操作读到的值都是同一个写操作所产生的; 两个调度中,每个数据项上的最后一个写操作的值是相同的。 分析:若两个操作之间存在冲突,这两个操作的顺序很重要。不会引起冲突的操作,执行顺序并不重要。 事务的并发控制主要是正确处理并行执行的事务对数据库的冲突 可串行化调度思想:让冲突的操作串行执行,非冲突的操作并行执行,可串行性事务,T6 begin transaction T6read yy=y+1write ycommit T6,time,t1,t2,t3,t4,t5,T7 be

14、gin transaction T7read x read yy=y+1write ycommit T7,T8begin transaction T8read xx=x+1write x commit T8,启动时,事务执行顺序T7,T8,T6 S1=R7(x),R8(x),W8(x),R6(y),W6(y),R7(y),W7(y) 逻辑上, T6先于T7读更新前的值yT7先于T8读更新前的值x 逻辑上的执行顺序为T6 T7 T8,事实上T8在T6 开始前就已完成,等价串行调度表 SR1=R6(y),W6(y), R7(x), R7(y) ,W7(y) , R8(x),W8(x),判断一个调度

15、与一个串行调度表是否等价是困难的,常须对写规则加严格的约束,如要求一个事务的所有读操作必须在写操作之前完成。基于该限制,判定给定的调度表是否是可串行的算法复杂度为多项式,否则若没有写限制则是一个NP完全问题 使用有向图判别可串行化调度有向图的结点是事务集S=T1,T2,Tn中的每个事务Ti,有向图的边Ti Tj表示两个事务Ti与Tj具有冲突操作P和Q,PQ,而且PTi,QTj。当且仅当S的有向图无回路时,S是可串行化的。例5-1中,S3=R1(X),W1(X), R2(X),W2(X), R2(Y),W2(Y), R1(Y),W1(Y),集中式数据库并发控制技术的目的就是保证得到一个可串行化的

16、调度,分布式数据库系统中,每个结点事务是可以并发的,而不同结点上的事务则完全可以并行。假定每个局部结点都是以集中式数据库的并非控制技术为基础,在各自站点上已经实现了局部可串行化的调度,那么,分布式并发控制的重点就是要构造一个可保证全局顺序的可串行化的调度。即:每个局部结点的调度Sk是可串行化的;可通过等价性获得一个分布式事务T1,T2,Tn的全局顺序,三.分布式事务的可串行性,三.分布式事务的可串行性 (1)分布式事务在分布式数据库环境中,一个事务可能要访问分布存储在多个站点上的数据。该事务将被分成多个子事务,每个子事务负责对一个数据存储站点进行访问。,例如:分布式基金转帐事务T1 。帐号X存

17、储在站点A上,帐号Y存储在站点B上。事务T1位于站点A的代理为T1A,事务T1位于站点B的代理为T1B,begin Transaction T1begin Transaction T1Aread balance Xbalance X=balance X-100if balance X0 thenbeginprint “insufficient funds”abort T1Aendend-ifwhite balance Xcommit T1Abegin Transaction T1Bread YY=Y100white balance Ycommit T1B Commit T1,T1是一个不可分割

18、的全局事务, 而每个子事务或代理都是执行 站点中不可分割的事务,子事 务或代理不仅要与相应的站点 并发执行的其他本地事务相互 协调,还要与分布式系统中全 局事务所产生的其他子事务相 互协调。因此,分布式数据库 给并发控制增加了难度。,事务T1位于站点A的代理为T1A,事务T1位于站点B的代理为T1B,例:两个全局事务T1,T2。在站点A,B上启动,各有两个子事务(代理),Site A begin Transaction T1Aread xwrite x commit T1A begin Transaction T2Aread xwrite x commit T2A,Site B begin T

19、ransaction T2Bread ywrite y commit T2B begin Transaction T1Bread ywhite y commit T1B,Time,A站点的调度表SA =R1(x),W1(x),R2(x),W2(x) = T1A T2BT1B,(2)分布式系统的可串行化问题局部调度与全局调度,虽然两个事务的所有子事务在每个站点上都是串行执行的,但两个事务之间却不是串行执行的。若全局事务T1,T2是由位于A,B站点的不同用户同时提交的,有可能可按这种方式调度。然而对于分布式事务而言,要求所有局部调度表是可串性的,同时要求所有的局部事务在全局范围内也是可串性的。,也

20、就是要求全局事务的所有子事务在每个局部站点上的可串性的调度表中出现的顺序必须相同:即:若TiATjA,则对于所有拥有Ti,Tj的代理站点K,都有TiKTjK T1KT2KT3KTnK称为事务在K站点的局部顺序T1T2T3Tn则称为事务的全局顺序,(3)可串行化调度begin Transaction T1 begin Transaction T2,串行调度:,一致性调度:如果执行一个调度s,使数据库从一个一致状态转变到另一个一致状态,则称调度s为一致性调度。,等价调度:两个有冲突的操作Oi和Oj,若:Oi和Oj属于S1,且OiOj,则Oi和Oj属于S2,也有OiOj。,调度:,串行调度 T1T2

21、 冲突操作W1(x),R2(x),串行调度T1T2 冲突操作R1(x),W2(x),冲突操作的顺序与S1相同,与S1等价调度,与S1,S2不等价,S3不是可串行化调度,S5与S4等价,结论: 同一事务集上的可串行化调度,调度结果未必相同。 同一事务集上的几个可串行化调度,调度执行的结果未必相同。 一个可串行化调度必定与某个串行调度等价,且是一致调度。 一致调度不一定是可串行化调度,串行调度是一致性调度。,可串行化调度的判别定义 使用“有向图”使用“有向图”判别比从定义直接判别容易,有向图,顶点集:事务集ST1,T2,Tn的每个事务T,边集:TiTj表示两个事务Ti与Tj具有冲突操作 P和Q,P

22、Q,PTi QTj,当且仅当S的有向图无回路时,S是可串行化的,例:S2:T1T2,W1(x)R2(x),W1(y)R2(y),S3:T1T2,W1(x)R2(x),W2(y)R1(y),有回路,(4)单副本可串行化相互一致性要求所有数据项副本的值都是相同的。能维持相互一致性的调度称作单副本可串行化。单副本可串行化的全局调度必须满足的条件: 每一个局部调度必须是可串行化的。 两个冲突操作在它们同时出现的各个局部调度中,必须具有相同的相对顺序。(其中冲突保证任何同时执行冲突事务的站点的可串行化顺序相同) 在有副本的数据库中,要保证单副本的串行性副本控制协议 一个数据项x有若干副本x1,x2,xn

23、,逻辑数据项,物理数据项,Mapping(副本控制协议),ROWA协议 (读一个/写全部协议),并发控制的主要目的:保证分布式事务及分布式数据库的一致性。它要实现分布式事务的可串行性,同时又要保持事务具有良好的并发度,以保证系统具有用户满意的效率。 分布式并发控制技术是以集中式数据库的并发控制技术为基础并针对分布式系统的特点扩展而来。 并发控制机制同步化原则:加锁法(相互排斥地访问共享数据(加锁)时标排序法(试图通过一些准则(协议)来对事务的执行进行排序)悲观的观点:事务是相互冲突地观点乐观的观点:没有太多的事务相互冲突的观点(1)悲观并发控制法 (2)乐观并发控制法:,三.分布式数据库系统的

24、并发控制技术,1. 加锁(Locking)DBMS中广泛使用的处理并发控制的方法加锁是事务T在对某个数据对象如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他的事务不能更新此数据对象。 基本特征:在对数据对象进行读写前,事务必须获得对该数据项同时进行读或写“锁”锁的粒度(Granularity):是指锁定数据项的范围:表、页面、行(记录)、数据项。缺省为记录锁或页面锁粒度小,并发度高,锁开销大锁的类型:共享锁(shared-s锁)又称读锁(S锁)(读操作不会发生冲突,允许多个事务对同一数据对象同时读)排他锁(Exclusiv

25、e-x锁)又称写锁(X锁)(写操作会产生冲突,同时只能一个事务对某一数据对象进行写)(有的DBMS提供)更新锁(Update-u锁),排他锁(X锁):若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他事务都不能再对A加任何类型的锁,直到T释放A上的锁。保证其他事务在T释放A上的锁之前不能再读取和修改A。 共享锁(S锁):若事务T对数据对象A加上S锁,则事务A可以读A但不能修改A,其他事务只能再对A加S锁,直到T释放A上的锁。保证其他事务可以读A,但在T释放A上的S锁之前不能对A做任何修改。 排他锁和共享锁的控制方式可以用相容矩阵表示:T1 T2 X S X N N YS N Y Y Y

26、 Y Y,加锁协议(Locking Protocol),加锁协议:在运用X锁和S锁对数据对象加锁时,还需约定一些规则,例如何时申请X锁或S锁、持锁时间、何时释放等,称这些规则为加锁协议。三级加锁协议分别在不同程度上解决:丢失更新、不可重复读、读“脏”数据的问题。 一级加锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。可防止“丢失更新”,并保证事务T是可恢复的。但若仅仅是读数据不对其进行修改,是不需加锁的,所以不能保证可重复读和不读“脏”数据。 二级加锁协议:一级加锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。可防止“丢失更新”,防读“脏”数据,但由于

27、读完数据即可释放S锁,不能保证可重复读。 三级加锁协议:一级加锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。可防止“丢失更新”,防读“脏”数据,保证可重复读。,分布式事务加锁准则: 读锁一个,写锁全部:读数据,用共享锁锁定被读数据的任一副本。写数据,用排他锁锁定被读数据的所有副本。 相容性规则:一事务对一数据加共享锁,该数据可以被另一事务以共享锁锁定。一事务对一数据加排他锁,其他事务不能对该数据加任何锁。 两个阶段锁定协议(Two Phase Locking-2PL):每一事务在未获得全部需要的锁之前不会释放任何锁。即每个事务的执行分为两个阶段: 生长阶段只获得锁收缩阶

28、段只释放锁保证事务的可串行性 事务如持有x锁,保持x锁,直到该事务结束为止。保证事务的隔离性,基本加锁算法:,分布式数据库中加锁的难度比集中式的大得多。因为:分布式数据库中数据的分布导致执行的分布,加锁的消息在网络上传输。通信代价大对多副本的数据,要实现同步更新,原则上就得锁定所有副本。因此,分布式数据库系统中加锁的方法有许多种,常用的基本加锁算法有:(1)简单的分布式加锁方法(2)主站点加锁法(3)主副本加锁法(4)快照方法,(1)简单的分布式加锁方法 类似于集中式,数据更新时,对同一数据的全部副本加锁,然后更新,再解除全部加锁。例如:.网络中有n个站点,则有:n个请求加锁的消息,n个加锁授

29、权的消息,n个更新数据的消息,n个修改执行了的消息,n个解锁的消息。相当大的传输量通信代价太大,不宜采用。,(2)主站点加锁法,模拟集中式,选一站点定义为“主站点”,负责系统全部加锁管理。所有站点都向这个主站点提出加锁请求,然后由主站点去处理加锁事宜。注意两点:1.访问数据要加锁,即使是读数据也要对该数据加必要的锁。 即:读锁一个,写锁全部2. 更新数据时必须保证所有站点上该数据的副本同样更改,所以为保证该数据所有副本同时作同样更新,更新结束才能释放X锁。优点:类似于集中式做法,便于加锁管理,减少通信代价缺点:所有加锁操作必须通过主站点进行,频繁,主站点过于繁忙而成为“瓶颈”,主站点故障,系统

30、瘫痪。,(3)主副本加锁法,对每个加锁数据(若有多个副本)指定一个主副本,不同数据集 的主副本在不同的站点上(主副本按使用情况,尽量就近分布)。 当处理程序对某个数据操作时,先对其主副本加锁,然后再进行操 作。对主副本加锁意味着对这个数据的所有副本都加锁。优点:主副本方法不仅减轻了主站点负担,使各站点负荷均衡,同时也减少了站点间控制消息的传输量。是一个比较好的并发控制方法。缺点:对只读操作要求过高,可采用快照方法补充。,(4)快照方法(Snapshot),类似于视图,但是实际数据的暂时凝聚,是数据库数据的一种存储方式Define Snapshot Male-studentsAs Select

31、* from s where sex=“M”Refresh Every day执行这个查询语句并把结果数据存放在数据库中名为Male-students的快照中。快照方法不考虑数据的复制,只考虑每个数据的“主”副本和定义在这些“主”副本上的任意多个快照。快照可以定义一个或多个“主”副本的部分拷贝,或全拷贝。快照是一个只读关系,即快照中的数据只能读不能写,也就是说,对读操作可使用“主”副本或快照,对写操作还必须在主副本上完成。 采用快照方法可完成复杂查询而又不影响更新。因为快照中的数据不受更新操作的影响,所以不会妨碍其他事务对有关数据的更新操作。虽然快照中的数据可能不是“全新的”,但在实际应用中,

32、很少真正需要“全新的”数据。,Eswaran et al. 1976结论:遵循了2PL的并发控制算法所产生的调度都是可串行的 一个事务应该在其确定不再需要其他加锁的情况下释放它所持有的锁。2PL把每个事务的执行分为两个阶段:一个阶段是事务获得锁时的生长阶段另一个阶段是事务释放锁时的萎缩阶段加锁点(Lock Point):指事务获得了它所要求的所有锁并且还没有开始释放任何一个锁的时刻。上图中,表明锁管理程序在完成对数据项的访问之后立即释放锁,这使得其他正在等待锁的事务可以提前得到锁,因而提高了并发的程度。但这是很难实现的,因为锁管理程序必须知道:事务已获得它所需的所有锁,不再对其他数据加锁。事务

33、不再需要访问已加锁的数据项,以释放加锁。若事务在释放锁后被撤销,可能导致“级联撤销”,2.两阶段锁协议(2PL:Two Phase Locking),GO,级联撤销:如果事务在释放锁后被撤销,就有可能会导致其它访问这个没有加锁的数据的事务也被撤销。,Back,由于这些困难,大多数2PL调度程序采用严格两阶段锁协议:在事务结束时,释放所有锁。,开始,数据项使用,结束,严格两阶段锁协议,加锁管理程序的职责仅限定到一个单独的站点上主站点2PL算法。而其他站点上的事务管理程序同这个加锁管理程序进行通信,其事务执行方法是通过集中式两阶段锁(C2PL)算法来实现。,加锁管理程序,合作站点,主站点,通信,D

34、P,TM,加锁管理程序,参与站点,主站点,DP(数据处理器),事务管理程序(TM),加锁请求 ,允许加锁 ,操作 ,操作结束,释放加锁,缺点:主站点易形成瓶颈。系统的可靠性降低(因主站点上的故障或无法访问而导致整个系统的失败),集中式2PL(C2PL) 2PL算法扩展到分布式DBMS(复制的或分片的),协调者,在每个数据项的多个副本中,选择一个副本为其主副本在该主副本的结点上实现加锁管理。每个加锁管理程序管理所指定的一组加锁单元上的锁。由事务管理程序向加锁管理程序发出对某一特定加锁单元的加锁或释放锁的请求。优点(与C2PL类型相比):减少了主结点上的负载,且不会增加事务管理程序与加锁管理程序之

35、间的通信。,主副本2PL(PC2PL) 对集中式2PL的向前扩展,以解决C2PL系统性能问题,加锁管理程序,其它副本参与站点,主副本站点,DP(数据处理器),事务管理程序(TM),加锁请求 ,允许加锁 ,操作 ,操作结束,释放加锁,协调者,。分布式2PL事务管理算法与C2PL-TM的不同: C2PL-TM中的加锁请求在分布式2PL中将发送给所有参与结点的加锁管理程序 操作不是由协调者事务管理程序传给数据处理器,而是由参与者的加锁管理程序,这意味着协调者事务管理程序并不等候“同意加锁请求”。 参与者的DP向参与者的事务管理程序发送“操作结束”信息或DP自身解锁,通知协调者TM。,协调者TM,参与

36、者LM,参与者DP,加锁请求 发给每个参与者,加锁请求,操作,操作结束,释放锁,分布式2PL(D2PL) -力求在每个站点实现加锁管理程序的职能,多粒度加锁的加锁协议: 多粒度加锁协议允许多粒度树中的每个结点被独立地加锁。 对一个结点加锁意味着这个结点的所有后裔结点也被加以同样类型的锁。 一个数据对象可能两种方式加锁: 显式加锁:应事务的要求直接对数据对象加锁。 隐式加锁:由其上级结点加锁而使该数据对象加上了锁。,数据库,关系1,关系n,元组,元组,元组,元组,最大的加锁数据粒度,最小的加锁数据粒度,三级粒度树,多粒度加锁与意向锁,系统检查锁冲突时,不仅要检查显式加锁,还要检查隐式加锁。 例:

37、事务T要对关系R1加X锁:系统必须检索其上级结点数据库、关系R1、以及R1中的每一个元组,若其中某一个数据对象已经加了不相容锁,则T必须等待。 对某个数据对象加锁,系统需检查: 检查该数据对象上有无显式加锁与之冲突。 检查其所有上级结点,显式加锁是否与该数据对象上的隐式加锁冲突。 检查其所有下级结点,显式加锁是否与本事务的隐式加锁冲突。 这样的检查方法效率很低。为此,引进一种新型锁意向锁(Intention Lock),意向锁(Intention Lock)如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁,对任一结点加锁时,必须先对它的上层结点加意向锁。如:对任一元组加锁时,必先对它所

38、在的关系加意向锁。事务T要对关系R1加x锁时,系统需要检查根结点数据库和关系R1。是否加了不相容的锁,而不再需要搜索和检查R1的每个元组是否加x锁。三种常用的意向锁:意向共享锁(Intent Share Lock)IS:对一个数据对象加IS锁,对其后裔均加S锁。如,要对某个元组加S锁,则要首先对关系和数据库加IS锁意向排它锁(Intent Exclusive Lock)IX:共享意向排它锁(Share Intent Exclusive Lock)SIX:S+IX,数据锁的相容矩阵,T1 T2 S X IS IX SIX - S Y N XISIXSIX-,ORACLE 的并发控制,T1 T2

39、S X RS RX SRX - S Y N Y N N YX N N N N N YRS Y N Y Y Y Y RX N N Y Y N Y SRX N N Y N N Y- Y Y Y Y Y Y,Oracle的加锁机制保证并发操作的可串行化,事务T:ST=R(x1),R(x2),W(x1),R(x3),W(x3) 若事务T遵守2PL协议,则它将占有写锁直至提交 若有一事务T1申请对数据项x1的写锁,而x1当时正被其他事务T2锁着,则会出现两种情况: (1)将T1放入x1的等待队列,直到x1的锁被T2释放。 (2)终止并回退T1。,T1 T2 lock R1lock R2:Lock R2等

40、待 等待 Lock R1等待 等待 等待 等待,四、死锁管理,加锁技术,可以避免由于并发冲突操作引起的数据错误,但也可能产生其他一些问题:活锁(Live Lock):某个事务永远处于等待状态,得不到执行的机会。解决活锁的办法:先来先服务(按请求加锁的先后次序对事务排队)。死锁(Dead Lock):可能两个或两个以上的事务都处于等待状态。每个事务都在等待其中另一个事务能释放锁,才能继续执行,结果任何一个事务都无法继续执行,形成死锁。,T1 T2 T3 T4lock R : lock R 等待 lock R Unlock 等待 等待 Lock R: 等待 Lock R 等待 等待 等待 等待 U

41、nlock 等待 等待 Lock R等待,活锁,死锁,分布式数据冗余(多副本)也会增加更新数据时引起死锁的机会。因为更新时需要对全部副本加X锁,有副本的每个站点上都有可能等待另一个事务释放锁,但每个事务只有在它全部完成后才能释放X锁,因此造成全局死锁。,站点B,存储x和y的副本 T1:read(x),write(y),站点A,存储y和z的副本 T2:read(y),write(z),存储z的副本 T3:read(z),write(x),站点C,等待释放对y的共享锁,等待释放对z的共享锁,等待释放对x的共享锁,多副本引起三个站点间的死锁,等待图(WFG) 分析死锁的一个有用工具,一种用来表示事务

42、之间相互等待关系的有向图。顶点:事务 有向弧:等待关系 箭头:等待方向Ti Tj 其中:x为数据项名,表示等待的是对哪个数据项的锁当且仅当等待图中至少包含一个回路,则存在一个死锁。等待释放对y的共享锁,T1,T2,T3,x,全局等待图(GWFG),分布式数据库系统中,参与死锁的两个事务可能在不同的站点运行。为每个站点做一个局部等待图是不够,需要画出全局等待图(GWFG)(即所有局部等待图的并) 例:四个事务T1,T2,T3,T4的等待关系:,T1T2T3T4T1,Site 1,T1,T2,Site 2,T4,T3,LWFG(Local Wait-For Graph),全局死锁,Site 1,T

43、1,T2,Site 2,T4,T3,GWFG(Global Wait-Fo Graph),解决死锁的方法,死锁的问题在操作系统和一般并行处理中已做了深入研究,目前数据库中解决死锁问题主要有两类方法:1.采取一定措施预防死锁的发生 (保守方法) 2.允许发生死锁,采用一定手段定期诊断系统中有无死锁,若有则解除。,1、死锁的预防方法,产生死锁的原因:两个或多个事务都已封锁了一些数据对象,且又都请求已为其他事务封锁的数据对象加锁,从而出现死等待。 预防死锁的基本想法:防止死锁的发生其实就是破坏产生死锁的条件。预防死锁通常又两种方法:(1) 一次加锁法:要求每个事务必须一次将所有要使用的数据全部加锁,

44、否则就不能继续执行。如:事务T1将数据对象R1和R2一次加锁,T1就可以执行下去,而T2等待。T1执行完后释放R1、R2上的锁,T2继续执行。这样不会发生死锁。一次加锁法虽个有效防止死锁的发生,但也存在问题:1)一次将以后要用到的全部数据加锁,势必扩大了封锁的范围,降低系统的并发度。2)很难事先精确确定每个事务所要封锁的数据对象,因数据库中的数据不断变化,只能扩大封锁范围,进一步降低了并发度。(2)一次预防性测试:若事务T1请求一资源,而该资源被另一事务T2所持有时,则进行一次预防性测试。当有发生死锁危险时,1)中止并重新启动其中一个事务;2)让事务等待,但若允许有等待,则决不可能发生死锁。,

45、预防性测试,预防性测试方法:把事务排序(按标识符的词典顺序排序,或按开始时间排序等)。方法:(假定按事务开始时间排序)(1)非占先权方法:排队在先者可能失去优先。旧事务等待新事务的“等待死亡”协议(基本思想:总是重新启动较年轻的事务)若Ti对已被Tj锁定的一数据项请求加锁,则只有在Ti比Tj年老时(TiTj)时,则Ti被终止并带同一时间戳重新启动允许较年老的事务去等待已持有资源的较年轻的事务,但不允许年轻的事务去等待较年老的事务。(2)占先权方法:排队在先者绝对优先若Ti对已被Tj锁定的一数据项请求加锁,则只有Ti比Tj年轻(TiTj)时才允许等待;否则(TiTj) ,Tj被终止并带同一时间戳

46、重新启动,允许不加锁执行。仍要求终止较年轻的事务,且允许年老的事务绝对优于年轻的事务,只有年轻的等待年老的。,两种方法的共同点:启动年轻的事务,“等待死亡”协议,Begin Ti申请Tj持有的锁if TiTj(Ti旧事务, Tj新事务)then 旧事务Ti等待Tj提交或回退释放锁else Ti新事务重启endif End,“受伤等待”协议,Begin Ti申请Tj持有的锁if TiTj (Ti旧事务, Tj新事务)then Tj新事务重启else 旧事务Ti等待Tj提交或回退释放锁endif End,两种方法的区别: 讨论区别,了解两种方法适用的情况,(1)非占先权方法中,一事务只有当它请求访

47、问一新的数据项时,如Ti,才可能被中止重启。对已经访问全部所需数据项的事务,如Tj,任何情况下不会被中止。对于必须执行在外部世界中不可逆动作的事务极其重要,如:分配现金或控制一个过程。而占先权方法中,对一持有锁的事务Tj虽然已快结束,不再要锁,但仍有可能因另一更年老的事务要求访问同一数据项而被中止。为避免这种可能,对占先权方法修改如下:令Tj为年轻且持锁的事务,若Tj已经不再请求锁(进入收缩阶段),就不终止Tj保证已获得全部数据项并要求结束的事务决不会重启,因进入收缩阶段的Tj,不会再要求获得新锁,不再请求新锁的事务就不会引起死锁,则不用终止Tj。 (2)在非占先权方法中,较老的事务等待年轻的。事务变老就失去优先性,在占先权法中,事务变老就增加优先性。 (3)在非占先权方法中,若事务TiTj(Ti比Tj年轻),Tj已锁住的资源重新启动的次数,Ti试图被中止并重启,再次试图锁住同一资源,若Tj长期持有该资源,则Ti将被多次重启。占先权法中,Ti持有一资源,并因一年老的事务Tj要求同一资源被重启,则Ti新的请求不会被重新启动,只一次重新启动。,

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

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报