数据库事务课件.ppt
《数据库事务课件.ppt》由会员分享,可在线阅读,更多相关《数据库事务课件.ppt(63页珍藏版)》请在冰豆网上搜索。
1,李宁西北工业大学计算机学院,第十章并发控制,2,2,第九章内容回顾,本章重点事务的概念和性质事务故障、系统故障和介质故障的恢复技术与原理Redo&Undo本章难点具有检查点的恢复技术,3,3,本章目录,10.1并发控制概述10.2封锁10.3封锁协议10.4活锁和死锁10.5并发调度的可串行性10.6两段锁协议10.7封锁的粒度11.8小结,4,4,10.1并发控制概述,多用户数据库系统银行、票务系统等多事务执行方式事务串行执行交叉并发方式(InterleavedConcurrency)同时并发方式(simultaneousconcurrency),本章讨论的数据库系统并发控制技术是以单处理机系统为基础的,5,5,10.1并发控制概述,事务是并发控制的基本单位并发控制的任务对并发操作进行正确调度保证事务的隔离性保证数据库的一致性,6,6,10.1并发控制概述,并发操作带来的数据不一致性丢失修改(lostupdate)-T2提交的结果覆盖了T1提交的结果不可重复读(non-repeatableread)-T1读,T2更新,T1再次读(与第一次读取数据不同)该类错误中还包括:
幻读(phantomrow)-T1读后,T2删除/插入部分记录,T1再读就不同脏数据(dirtyread)-T1修改写回,T2读,T1回滚,此时T2读数据为脏数据,7,7,10.1并发控制概述,丢失修改(lostupdate)-T2提交的结果覆盖了T1提交的结果,8,8,10.1并发控制概述,不可重复读(non-repeatableread)-T1读,T2更新,T1再次读(与第一次读取数据不同),T1读取B=100进行运算T2读取同一数据B,对其进行修改后将B=200写回数据库T1为了对读取值校对重读B,B已为200,与第一次读取值不一致,9,9,10.1并发控制概述,幻读(phantomrow)-T1读后,T2删除/插入部分记录,T1再读就不同,10,10,10.1并发控制概述,脏数据(dirtyread)-T1修改写回,T2读,T1回滚,此时T2读数据为脏数据,T1将C值修改为200,T2读到C为200T1由于某种原因撤销,其修改作废,C恢复原值100这时T2读到的C为200,与数据库内容不一致,就是“脏”数据,11,11,10.1并发控制概述,并发控制的主要技术封锁(Locking)时间戳(Timestamp)乐观控制法多版本并发控制(MVCC),12,12,本章目录,10.1并发控制概述10.2封锁10.3封锁协议10.4活锁和死锁10.5并发调度的可串行性10.6两段锁协议10.7封锁的粒度11.8小结,13,13,10.2封锁,什么是封锁封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。
基本封锁类型一个事务对某个数据对象加锁后究竟拥有什么样的控制是由封锁的类型决定的。
排它锁(Exclusivelock,简记为X锁,又称为写锁)若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。
共享锁(Sharelock,简记为S锁,又称为读锁)若事务T对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁,14,14,10.2封锁,锁的相容矩阵,15,15,本章目录,10.1并发控制概述10.2封锁10.3封锁协议10.4活锁和死锁10.5并发调度的可串行性10.6两段锁协议10.7封锁的粒度11.8小结,16,16,10.3封锁协议,什么是封锁协议在运用X锁和S锁对数据对象加锁时,需要约定一些规则,这些规则为封锁协议(LockingProtocol)。
何时申请X锁或S锁持锁时间何时释放不同的规则所形成的各种不同的封锁协议,它们分别在不同的程度上为并发操作的正确调度提供一定的保证。
一级封锁协议二级封锁协议三级封锁协议,17,17,10.3封锁协议,一级封锁协议事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。
事务结束包括commit和rollback。
注意读数据无需加锁!
可以解决:
-修改丢失无法解决:
-可重复读-读脏数据,18,18,10.3封锁协议,二级封锁协议一级封锁协议+事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。
可以解决:
-修改丢失-读脏数据无法解决:
-可重复读,19,19,10.3封锁协议,三级封锁协议一级封锁协议+事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。
可以解决:
-修改丢失-读脏数据-可重复读无法解决:
20,20,10.3封锁协议,封锁协议小结-各级封锁区别:
什么操作需要申请封锁以及何时释放锁-封锁协议级别越高,一致性程度越高,21,21,本章目录,10.1并发控制概述10.2封锁10.3封锁协议10.4活锁和死锁10.5并发调度的可串行性10.6两段锁协议10.7封锁的粒度11.8小结,22,22,10.4.1活锁,封锁机制带来的问题死锁活锁,活锁:
T1、T2、T3、T4相继申请R的锁,可是T2可能永远处于等待之中。
解决方案:
依据请求封锁的先后次序对事务排队,首先批准申请队列中第一个事务获得锁。
23,23,10.4.2死锁,死锁,T1在等待T2释放R2,而T2又在等待T1释放R1,T1和T2两个事务永远不能结束,形成死锁。
24,24,10.4.2死锁,解决死锁-预防死锁发生,破坏产生死锁的条件,1.一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。
如右图:
T1一次对R1和R2加锁引起问题:
1.扩大封锁范围,降低系统并发度。
2.由于数据的动态性,难以事先精确确定需要加锁的数据对象-扩大封锁范围,系统并发度再次降低,25,25,10.4.2死锁,解决死锁-预防死锁发生,2.顺序封锁法预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。
如树结构中,封锁顺序必须是从根节点开始。
引起问题:
1.维护成本高:
-需要封锁的数据对象极多,-随数据的插入、删除等操作而不断地变化。
2.难以实现:
事务的封锁请求可以随着事务的执行而动态地决定,很难事先确定每一个事务要封锁哪些对象,因此也就很难按规定的顺序去施加封锁。
死锁的预防不太适用,26,26,10.4.2死锁,解决死锁-死锁的诊断与解除,1.超时法如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。
优点:
实现简单缺点:
-有可能误判死锁-时限若设置得太长,死锁发生后不能及时发现,27,27,10.4.2死锁,解决死锁-死锁的诊断与解除,2.等待图法用事务等待图动态反映所有事务的等待情况。
-若T1等待T2,则T1,T2之间划一条有向边,从T1指向T2-定期检测,如果发现该有向图中存在回路,则认为存在死锁,解除死锁:
选择一个处理死锁代价最小的事务,将其撤消,释放其所持有的锁,使其它事务能继续运行下去。
28,28,本章目录,10.1并发控制概述10.2封锁10.3封锁协议10.4活锁和死锁10.5并发调度的可串行性10.6两段锁协议10.7封锁的粒度11.8小结,29,29,10.5并发调度的可串行性,什么样的并发操作调度是正确的?
并行调度是随机的,不同的调度可能会产生不同的结果。
将所有事务串行起来的调度策略一定是正确的调度策略。
以不同的顺序串行执行事务也可能会产生不同的结果,但由于不会将数据库置于不一致状态,所以都可认为是正确的。
可串行化(Serializable)的调度策略:
几个事务的并行执行是正确的,当且仅当其结果与按某一次序串行地执行它们时的结果相同。
30,30,10.5.1可串行性调度,可串行化调度事务T1:
读B;A=B+1;写回A事务T2:
读A;B=A+1;写回B,A=3B=4,A=4B=3,31,31,10.5.1可串行性调度,不可串行化调度事务T1:
读B;A=B+1;写回A事务T2:
读A;B=A+1;写回B,A=3B=3,A=3B=4,32,32,10.5.2冲突可串行性调度,冲突可串行化调度:
判断可串行化的方法之一一个比可串行化更严格的条件商用系统中的调度器采用冲突操作:
不同的事务对同一数据的读写操作和写写操作Ri(x)与Wj(x)/*事务Ti读x,Tj写x,其中ij*/Wi(x)与Wj(x)/*事务Ti写x,Tj写x,其中ij*/不同事务的冲突操作是不能交换的,33,33,10.5.2冲突可串行性调度,冲突可串行化调度一个调度Sc在保证冲突操作的次序不变的情况下,通过交换两个事务不冲突操作的次序得到另一个调度Sc,如果Sc是串行的,称调度Sc是冲突可串行化的调度。
调度1,调度2,调度3,调度4,因为调度1等价于一个串行调度T1-T2,所以调度1是一个冲突可串行化的调度。
34,34,10.5.2冲突可串行性调度,若一个调度是冲突可串行化,则一定是可串行化的调度。
因为Sc2等价于一个串行调度T1-T2,所以Sc1是冲突可串行化的调度。
Sc1也是一个可串行化调度。
Sd调度:
r1(A)w1(A)r2(A)W2(A)r2(B)w2(B)r1(B)w1(B)是否可串行化?
35,35,10.5.2冲突可串行性调度,冲突可串行化调度是可串行化调度的充分条件,不是必要条件。
还有不满足冲突可串行化条件的可串行化调度。
例如:
有三个事务,但是调度L2是可串行化的,因为L2执行的结果与调度L1相同,Y的值都等于T2的值,X的值都等于T3的值,如何保证并发操作调度正确性?
封锁方法:
两段锁协议时标方法乐观方法,36,36,本章目录,10.1并发控制概述10.2封锁10.3封锁协议10.4活锁和死锁10.5并发调度的可串行性10.6两段锁协议10.7封锁的粒度11.8小结,37,37,10.6两段锁协议,“两段”锁的含义(Two-PhaseLocking,简称2PL)事务分为两个阶段1.第一阶段是获得封锁,也称为扩展阶段;事务可以申请获得任何数据项上的任何类型的锁,但是不能释放任何锁2.第二阶段是释放封锁,也称为收缩阶段。
事务可以释放任何数据项上的任何类型的锁,但是不能再申请任何锁。
遵守2PL,不遵守2PL,38,38,10.6两段锁协议,结论:
并行执行的所有事务均遵守两段锁协议,则对这些事务的所有并行调度策略都是可串行化的。
即:
(1)所有遵守两段锁协议的事务,其并行执行的结果一定是正确的。
(2)事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件。
(3)可串行化的调度中,不一定所有事务都必须符合两段锁协议。
39,39,10.6两段锁协议,左图的调度是遵守两段锁协议的,因此一定是一个可串行化调度。
如何验证?
40,40,10.6两段锁协议,两段锁协议与防止死锁的一次封锁法的比较:
一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行,因此一次封锁法遵守两段锁协议;但是两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁。
例:
遵守两段锁协议的事务发生死锁,41,41,本章目录,10.1并发控制概述10.2封锁10.3封锁协议10.4活锁和死锁10.5并发调度的可串行性10.6两段锁协议10.7封锁的粒度11.8小结,42,42,10.7封锁的粒度,封锁粒度(Granularity)X锁和S锁都是加在某一个数据对象上封锁粒度即指封锁对象的大小封锁的对象逻辑单元物理单元,例:
在关系数据库中,封锁对象可以是:
逻辑单元:
属性值、属性值的集合、元组、关系、索引项、整个索引、整个数据库等物理单元:
页(数据页或索引页)、物理记录等,43,43,10.7封锁的粒度,封锁粒度的关系