您好、欢迎来到现金彩票网!
当前位置:彩运网 > 封锁粒度 >

第十一章 并发控制

发布时间:2019-04-26 04:30 来源:未知 编辑:admin

  第十一章 并发控制 主要内容: 主要内容 什么是并发控制 封锁(Locking)及封锁协议 并发调度的可串行性 和两段锁协议 封锁的粒度 Oracle的并发控制 11.1 并发控制概述 当多个用户并发地存取数据库时会产生多个事务同时 存取同一数据的情况。如果对并发操作不加控制就可能 导致存取不正确的数据,破坏数据库的一致性。因此, 数据库管理系统必须提供并发控制机制。并发控制机制 是衡量一个数据库管理系统性能的重要标志之一。 下面用一个例子说明并发操作可能带来的数据不一致 性问题。考虑飞机订票系统中的一个活动序列: ① 售票点(甲事务)读出某航班的机票余额A,设A=16。 ② 售票点(乙事务)读出同一航班的机票余额A,也为16。 ③ 售票点卖出一张机票,修改余额A←A-1。 所以A为15,把A写回数据库。 ④ 售票点也卖出一张机票,修改余额A←A-1, 所以A为15,把A写回数据库。 结果明明卖出两张机票,数据库中机票余额只减少1。 并发操作带来的数据不一致性包括以下三类: 1. 丢失修改(Lost Update) 两个事务T1和T2读入同一数据 并修改,T2提交的结果破坏了 T1提交的结果,导致T1的修改 被丢失。 2. 不可重复读(Non-Repeatable read) 这是指事务T1读取数据后,事务 T2执行更新操作,使T1无法再现 前一次读取结果。不可重复读包括 三种情况: ⑴ 事务T1读取某一数据后,事务 T2对其做了修改,当事务1再次读 该数据时,得到与前一次不同的值。 例如在图8.1(b)中,T1读取B=100 进行运算,T2读取同一数据B,对 其进行修改后将B=200写回数据库。 T1为了对读取值校对重读B,B已 为200,与第一次读取值不一致。 不可重复读的第二种和第三种情况是: ⑵ 事务T1按一定条件从数据库中读取了某些数据记录后, 事务T2删除了其中部分记录,当T1再次按相同条件读取 数据时,发现某些记录神秘地消失了。 ⑶ 事务T1按一定条件从数据库中读取某些数据记录后, 事务T2插入了一些记录,当T1再次按相同条件读取数据 时,发现多了一些记录。 3. 读“脏”数据(dirty read) 读“脏”数据是指事务T1修改 某一数据,并将其写回磁盘, 事务T2读取同一数据后,T1由 于某种原因被撤消,这时T1已 修改过的数据恢复原值,T2读 到的数据就与数据库中的数据 不一致,则T2读到的数据就为 脏数据即不正确的数据,如图 8.1(c) 。 产生上述三类数据不一致性的主要原因是并发操作破 坏了事务的隔离性。并发控制就是要用正确的方式调度 并发操作,使一个用户事务的执行不受其它事务的干扰, 从而避免造成数据的不一致性。 并发控制的主要技术是封锁(Locking)。 11.2 封锁 封锁是实现并发控制的一个非常重要的技术。 封锁: 封锁:所谓封锁就是事务T在对某个数据对象例 如表、记录等操作之前,先向系统发出请求,对 其加锁。加锁后事务T就对该数据对象有了一定的 控制,在事务T释放它的锁之前,其它的事务不能 更新此数据对象。 基本的封锁类型有两种: 排它锁(Exclusive Locks,X锁) 排它锁 X 共享锁(Share Locks,S锁) 共享锁 S 11.2 封锁 排它锁(Exclusive Locks,X锁) :排它锁又称为写锁。 排它锁 X 若事务T对数据对象A加上X锁,则只允许T读取和修改A, 其它任何事务都不能再对A加任何类型的锁,直到T释放A 上的锁。这就保证了其它事务在T释放A上的锁之前不能再 读取和修改A。 共享锁(Share Locks,S锁) :共享锁又称为读锁。若 共享锁 S 事务T对数据对象A加上S锁,则事务T可以读A,但不能修 改A,其它事务只能再对A加S锁,而不能加X锁,直到T释 放A上的S锁。这就保证了其它事务可以读A,但在T释放A 上的S锁之前不能对A做任何修改。 11.3 封锁协议 在运用X锁和S锁这两种基本封锁对数据对象加锁时,还 需要约定一些规则,例如应何时申请X锁或S锁、持锁时间、 何 时 释 放 等 。 我 们 称 这 些 规 则 为 封 锁 协 议 ( Locking Protocol)。对封锁方式规定不同的规则,就形成了各种 不同的封锁协议。对并发操作的不正确调度可能会带来丢 失修改、不可重复读和读“脏”数据等不一致性问题,下 面介绍的三级封锁协议分别在不同程度上解决了这一问题, 为并发操作的正确调度提供一定的保证。不同级别的封锁 协议达到的系统一致性级别是不同的。 一、一级封锁协议 一级封锁协议是: 一级封锁协议是:事务T在修 改数据R之前必须先对其加X锁, 直到事务结束才释放。事务结 束包括正常结束(COMMIT)和 非正常结束(ROLLBACK)。 一级封锁协议可防止丢失修改, 并保证事务T是可恢复的。如 图8.3(a)。 在一级封锁协议中,如果仅仅 是读数据不对其进行修改,是 不需要加锁的,所以它不能保 证可重复读和不读“脏”数据。 二、二级封锁协议 二级封锁协议是: 二级封锁协议是:一级封锁 协议加上事务T在读取数据R 之前必须先对其加S锁,读 完后即可释放S锁。 二级封锁协议除防止了丢失 修改,还可进一步防止读 “脏”数据。如图8.3(c)。 三、三级封锁协议 三级封锁协议是: 三级封锁协议是:一级封锁协议加上事务T在读取数据R之 前必须先对其加S锁,直到事务结束才释放。 三级封锁协议除防止了丢失修改和不读‘脏’数据外,还 进一步防止了不可重复读。如图8.3(b)。 11.4 活锁和死锁 和操作系统一样,封锁的方法可能引起活锁和死锁。 一、活锁 活锁: 活锁:如果事务T1封锁了数据R,事务T2又请求封锁R,于 是T2等待。T3也请求封锁R,当T1释放了R上的封锁之后系 统首先批准了T3的请求,T2仍然等待。然后T4又请求封锁R, 当T3释放了R上的封锁之后系统又批准了T4的请求,......, T2有可能永远等待,这就是活锁的情形,如图8.4(a)所示。 避免活锁的简单方法是采用先来先服务的策略。 二.死锁 死锁: 死锁:如果事务T1封锁了 数据R1,T2封锁了数据R2, 然后T1又请求封锁R2,因 T2已封锁了R2,于是T1等 待T2释放R2上的锁。接着 T2 R2 T2又申请封锁R1,因T1已 封锁了R1,T2也只能等待 T1释放R1上的锁。这样就 出现了T1在等待T2,而T2 又在等待T1的局面,T1和 T2两个事务永远不能结束, 形成死锁。如图8.4(b)所示。 1. 死锁的预防 一次封锁法:要求每个事务必须一次将所有要使用的数据 全部加锁,否则就不能继续执行。一次封锁法虽然可以有效 地防止死锁的发生,但也存在问题,一次就将以后要用到的 全部数据加锁,势必扩大了封锁的范围,从而降低了系统的 并发度。 顺序封锁法:预先对数据对象规定一个封锁顺序,所有事 务都按这个顺序实行封锁。顺序封锁法可以有效地防止死锁, 但也同样存在问题。事务的封锁请求可以随着事务的执行而 动态地决定,很难事先确定每一个事务要封锁哪些对象,因 此也就很难按规定的顺序去施加封锁。 2.死锁的诊断与解除 死锁的诊断与解除 ① 超时法 如果一个事务的等待时间超过了规定的时限,就认为发生 了死锁。超时法实现简单,但其不足也很明显。一是有可能 误判死锁,事务因为其他原因使等待时间超过时限,系统会 误认为发生了死锁。二是时限若设置得太长,死锁发生后不 能及时发现。 2.死锁的诊断与解除 死锁的诊断与解除 ②等待图法 事务等待图是一个有向图G=(T,U)。 T为结点的集合,每 个结点表示正运行的事务;U为边的集合,每条边表示事务 等待的情况。若T1等待T2 ,则T1、T2之间划一条有向边,从 T1指向T2。事务等待图动态地反映了所有事务的等待情况。 并发控制子系统周期性地(比如每隔1分钟)检测事务等待 图,如果发现图中存在回路,则表示系统中出现了死锁。 11.5 并发调度和可串行性 如果一个事务运行过程中没有其他事务同时运行,也就是 说它没有受到其他事务的干扰,那么就可以认为该事务的 运行结果是正常的或者预想的。因此将所有事务串行起来 的调度策略一定是正确的调度策略。虽然以不同的顺序串 行执行事务可能会产生不同的结果,但由于不会将数据库 置于不一致状态,所以都是正确的。 定义:多个事务的并发执行是正确的,当且仅当其结果与 按某一次序串行地执行它们时的结果相同。我们称这种调 度策略为可串行化(Serializable)的调度。 可串行化( 可串行化 Serializable)的调度。 例如,现在有两个事务,分别包含下列操作: 事务T1:读B;A=B+1;写回A; 事务T2:读A;B=A+1;写回B; 假设A、B的初值均为2。按 T1 T2 的次序执行,结果为A= 3,B=4;按 T2 T1 的次序执行,结果为B=3, A=4。 (c)中两个事务是交错执行的, 由于其执行结果与(a)、(b)的结 果都不同,所以是错误的调度。 (d)中两个事务也是交错执行的, 其执行结果与串行调度(a)的执 行结果相同,所以是正确的调 度。 为了保证并发操作的正确性,DBMS的并发控制机 制必须提供一定的手段来保证调度是可串行化的。 目前DBMS普遍采用封锁方法实现并发操作调度的 可串行性,从而保证调度的正确性。 11.6 两段锁协议 两段锁协议: 两段锁协议:所谓两段锁协议是指所有事务必须分两个阶 段对数据项加锁和解锁: 在对任何数据进行读、写操作之前,首先要申请并获得 对该数据的封锁,在释放一个封锁之后,事务不再申请 和获得任何其他封锁。 所谓“两段”锁的含义是,事务分为两个阶段,第一阶段 是获得封锁,也称为扩展阶段。这在阶段,事务可以申请 获得任何数据项上的任何类型的锁,但是不能释放任何锁。 第二阶段是释放封锁,也称为收缩阶段。在这阶段,事务 可以释放任何数据项上的任何类型的锁,但是不能再申请 任何锁。 例如事务T1遵守两段锁协议,其封锁序列是: Slock A … Unlock A … Slock B … Xlock C … Unlock C … Unlock B; ; 可以证明,若并发执行的所有事务均遵守两段锁协议,则 对这些事务的任何并发调度策略都是可串行化的。 另外要注意两段锁协议和防止死锁的一次封锁法的异同之 处。一次封锁法要求每个事务必须一次将所有要使用的数 据全部加锁,否则就不能继续执行,因此一次封锁法遵守 两段锁协议;但是两段锁协议并不要求事务必须一次将所 有要使用的数据全部加锁,因此遵守两段锁协议的事务可 能发生死锁。 11.7 封锁的粒度 封锁的对象的大小称为封锁粒度(Granularity)。封锁的 对象可以是逻辑单元,也可以是物理单元。以关系数据库 为例,封锁对象可以是这样一些逻辑单元: 属性值、属性 值的集合、元组、关系、索引项、整个索引直至整个数据 库;也可以是这样一些物理单元: 页(数据页或索引页)、 块等。 封锁粒度与系统的并发度和并发控制的开销密切相关。直 观地看,封锁的粒度越大,数据库所能够封锁的数据单元 就越少,并发度就越小,系统开销也越小;反之,封锁的 粒度越小,并发度较高,但系统开销也就越大。 因此, 如果在一个系统中同时支持多种封锁粒度供不同的 事务选择是比较理想的,这种封锁方法称为多粒度封锁 (multiple granularity locking)。选择封锁粒度时应该同时考 虑封锁开销和并发度两个因素,适当选择封锁粒度以求得 最优的效果。一般说来,需要处理大量元组的事务可以以 关系为封锁粒度;需要处理多个关系的大量元组的事务可 以以数据库为封锁粒度;而对于一个处理少量元组的用户 事务,以元组为封锁粒度就比较合适了。 11.8 Oracle的并发控制 的并发控制 Oracle的锁分为两大类: 数据锁和字典锁 字典锁。 数据锁 字典锁 Oracle主要提供了5种数 据锁:共享锁、排它锁、 行级共享锁、行级排它锁 和共享行级排它锁。其封 锁粒度包括行级和表级。 本章小结 DBMS必须提供并发控制机制来协调并发用户的并发操 作以保证并发事务的隔离性,保证数据库的一致性。 数据库的并发控制以事务为单位,通常使用封锁技术实 现并发控制。 两类最常用的封锁和三级封锁协议。 并发控制机制调度并发事务操作是否正确的判别准则是 可串行性,两段锁协议是可串行化调度的充分条件,但 不是必要条件。 对数据对象施加封锁,会带来活锁和死锁问题 。

http://funnyland.net/fengsuolidu/62.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有