资源预览内容
第1页 / 共51页
第2页 / 共51页
第3页 / 共51页
第4页 / 共51页
第5页 / 共51页
第6页 / 共51页
第7页 / 共51页
第8页 / 共51页
第9页 / 共51页
第10页 / 共51页
亲,该文档总共51页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第12章数据库安全及维护引入 事务(Transaction)SQL Server能将逻辑相关的一组操作绑定在一起,以便服务器保持数据的完整性。学习目标 事务的概念和ACID特性 并发操作带来数据的不一致性问题 封锁是实现并发控制的一个非常重要的技术学习完本课程,您应该能够:知识重、难点分析重点: 事务的概念和ACID特性 并发操作带来数据的不一致性问题难点: 封锁是实现并发控制的一个非常重要的技术一、基本概念1事务 事务(Transaction)是并发控制的单位,是用户定义的一个操作序列。这些操作要么都做,要么都不做,是一个不可分割的工作单位。在SQL语言中,定义事务的语句有: BEGIN TRANSACTION COMMIT ROLLBACK事务通常是以BEGIN TRANSACTION开始,以COMMIT或ROLLBACK结束。COMMIT表示提交,即提交事务的所有操作。具体地说就是将事务中所有对数据库的更新写回到磁盘上的物理数据库中去,事务正常结束。ROLLBACK表示回滚,即在事务运行的过程中发生了某种故障,事务不能继续进行,系统将事务中对数据库的所有以完成的操作全部撤消,滚回到事务开始的状态。事务三种事务运行模式1、自动提交事务(默认事务管理模式) 每条单独的语句都是一个事务。每个语句后都隐含一个COMMIT。2、显式事务 以BEGIN TRANSACTION显式开始,以COMMIT或ROLLBACK显式结束。3、隐性事务 在前一个事务完成时,新事务隐式启动,但每个事务仍以COMMIT或ROLLBACK显式结束。事务的特性(ACID特性)1) 原子性(Atomicity)事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。2) 一致性(Consistency)事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。3) 隔离性(Isolation)一个事务的执行不能被其他事务干扰。4) 持续性/永久性(Durability)一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。1) 原子性(Atomicity)银行转帐:事务T从A帐户过户50¥到B帐户。 T: Read(A); A=A-50; Write(A); Read(B); B=B+50; Write(B);Read(X):从数据库传送数据项X到事务的工作区中。Write(X):从事务的工作区中将数据项X回写到数据库。这个工作不能只完成一部分,它必须满足原子性。 2) 一致性(Consistency)事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。当数据库只包含成功事务提交的结果时,就说明数据库处于一致状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断,系统将事务中对数据库的所有已完成的操作全部撤消,滚回到事务开始的一致状态。如银行转帐,转帐前后两个帐户金额之和应保持不变。3) 隔离性(Isolation)一个事务的执行不能被其他事务干扰。事务查看数据时数据所处的状态,要么是另一并发事务修改它以前的状态,要么是另一并发事务修改它以后的状态,事务不会查看中间状态的数据。这称为可串行性。对任何一对事务T1,T2,在T1看来,T2要么在T1开始之前已经结束,要么在T1完成之后再开始执行。4) 持续性/永久性(Durability一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其执行结果有任何影响。系统发生故障不能改变事务的持久性。活动状态中止状态失败状态提交状态部分提交状态初始状态最后一条语句被执行后事务回滚,数据库恢复到事务开始状态事务无法继续正常运行成功完成,永久写入数据库 Use 学生管理数据库 Go Begin Tran Mytran -启动事务 Insert into 学生表 Values(202X08003,李四,男,计算机,软件2班,22) -插入一条记录 Delete 学生表 Where 学号=202X08003 -删除记录 Rollback Tran Mytran -回滚事务 Commit Tran Go Select * From 学生表丢失修改(Lost Update) 丢失更新:两个事务T1和T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果,导致T1的修改被丢失。脏读(Dirty Read) 事务T1修改某一数据,并将其写回磁盘,事务T2读取同一数据后,T1由于某种原因被撤消,这时T1已修改过的数据恢复原值,T2读到的数据就与数据库中的数据不一致,则T2读到的数据就为“脏”数据。不可重复读l事务T1读取某一数据后,事务T2对其做了修改,当事务T1再次读该数据时,得到与前一次不同的值。l事务T1按一定条件从数据库中读取了某些数据记录后,事务T2删除了其中部分记录,当事务T1再次按相同条件读取数据时,发现某些记录神秘地消失了。l事务T1按一定条件从数据库中读取了某些数据记录后,事务T2插入了一些记录,当事务T1再次按相同条件读取数据时,发现多了一些记录。后两种不可重复读有时也称为幻影(Phantom Row)现象。幻像读当对某行执行插入或删除操作,而该行属于某个事务正在读取的行的范围时,会发生幻像读问题。事务第一次读的行范围显示出其中一行已不复存在于第二次读或后续读中,因为该行已被其它事务删除。同样,由于其它事务的插入操作,事务的第二次或后续读显示有一行已不存在于原始读中。事务的调度事务的执行顺序称为一个调度,表示事务的指令在系统中执行的时间顺序。一组事务的调度必须保证: 包含了所有事务的操作指令。 一个事务中指令的顺序必须保持不变。串行调度:n 串行调度中,属于同一事务的指令紧挨在一起。n 对有N个事务的事务集,可以有N!个有效调度。并行调度:n 在并行调度中,来自不同事务的指令可以交叉执行。n 当并行调度等价于某个串行调度时,则称它是正确的。串行调度: 并发调度: 并行Vs串行: 并行事务会破坏数据库的一致性。 串行事务效率底。并行的优点:1、一个事务由不同的步骤组成,所涉及的系统资源也不同,这些步骤可以并发执行,以提高系统的吞吐量。2、系统中存在着周期不等的各种事务,串行会导致难于预测的时延。如果各个事务所涉及的是数据库的不同部分,采用并发会减少事务平均响应时间。核心问题:在保证一致性的前提下,最大限度地提高并发度。调度的简化 事务并发执行时,只有访问相同数据项的基本操作read和write才会在事务间产生影响。 调度的可串行化 调度的目的就是用于确定那些可以保证数据库一致性的所有事务的全部指令的执行序列!如果一个并发调度的执行效果与一个包含相同事务的串行调度的执行效果是相同的,我们就说它们是等价的。事务的串行执行可以保证数据库的一致性,这时不言而喻的。因此,与之等价的并发调度也可以保证数据库的一致性。 指令的可交换性 1、read-read指令(不冲突 ) 指令的可交换性2、read-write指令(冲突 ) 指令的可交换性3、write-read指令(冲突 )指令的可交换性4、write-write指令(冲突 )调度的可恢复性 1、可恢复调度 事务T7读取了事务T6所写的数据A,如果事务T6发生故障而回滚,就有可能引起T7的回滚,因此事务T6必须在T7提交之前进行提交,才能保证调度中事务是可恢复的。2、无级联调度 为了避免调度中事务的级联回滚,对于每对事务Ti和Tj,如果Tj读取了由Ti所写的数据项,则Ti必须在Tj读取之前提交。我们把这样的调度称为无级联调度。 并发控制:就是要用正确的方式调度并发操作,避免造成数据的不一致性,使一个用户事务的执行不受其它事务的干扰。另一方面,对数据库的应用有时允许某些不一致性。并发控制的主要方法是采用封锁机制(Locking)。 并发控制封锁:事务对数据库操作之前,先对数据加锁以便获得这个数据对象的一定控制,使得其他事务不能更新此数据,直到该事务解锁为止。1、封锁的类型:共享锁/S锁,也称读锁(RLOCK):若事务T对数据对象A加上S锁,则事务T可以读取A但不能修改A,其他事务只能对A加S锁,而不能加X锁,直到T释放A上的S锁。保证了其他事务可以读A,但在T释放A上的锁之前不能修改A。排他锁/X锁,也称写锁(WLOCK):若事务T对数据对象A加上X锁,则只允许T读取和修改A,其他任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。保证了其他事务在T释放A上的锁之前不能再读取和修改A。 封锁2、封锁类型的控制方式封锁类型决定控制方式,用相容矩阵表示控制方式。 X锁S锁X锁NNYS锁NYYYYY T2T1 2、 封锁粒度封锁粒度越大,系统中能够被封锁的对象就越少,并发度就越小,但同时系统开销也越小。3、 封锁协议对何时申请X锁或S锁、持锁时间、何时释放等规定一些规则,称为封锁协议。1) 保证数据一致性的封锁协议三级封锁协议(1) 一级封锁协议:事务T在修改数据R之前必须先对其加X锁,直到事务结束才释放。-防止丢失修改。(2) 二级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,读完后即可释放S锁。-防止丢失修改、防止读“脏”数据。(3) 三级封锁协议:一级封锁协议加上事务T在读取数据R之前必须先对其加S锁,直到事务结束才释放。-防止丢失修改、防止读“脏”数据、防止了不可重复读。2) 保证并行调度可串行性的封锁协议两段锁协议两段锁(two-phase lock, 2PL)协议:1)对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁;2)在释放一个封锁之后,事务不再获得任何其他封锁。3、用封锁机制解决购买火车票问题:活锁与死锁1、 活锁如果事务T1封锁了数据R,事务T2又请求封锁R,于是T2等待。事务T3也请求封锁R,当T1释放了R上的封锁之后系统首先批准了T3的请求,T2仍然等待。然后事务T4又请求封锁R,当T3释放了R上的封锁之后系统又批准了T4的请求T2有可能永远等待,这就是活锁的情形。避免活锁的简单方法是采用先来先服务的策略。活锁与死锁2、 死锁如果事务T1封锁了数据R1,事务T2封锁了数据R2,然后T1又请求封锁R2,因为T2已封锁了R2,于是T1等待T2释放R2上的锁。接着T2又申请封锁R1,因为T1已封锁了R1,T2也只能等待T1释放R1上的锁。这样就出现了T1在等待T2,而T2又在等待T1的局面,T1和T2两个事务永远不能结束,形成死锁。1)死锁的预防2)一次封锁法:每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。顺序封锁法:预先对数据对象规定一个封锁顺序,所有事务都按照这个顺序实行封锁。2) 死锁的诊断超时法:如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。等待图法:事务等待图是一个有向图G = ( T, U)。T为结点的集合,每个结点表示正运行的事务;U为边的集合,每条边表示事务等待的情况。若T1等待T2,则T1、T2之间划一条有向边,从T1指向T2。事务等待图动态地反映了所有事务的等待情况。并发控制子系统周期性地检测事务等待图,如果发现图中存在回路,则表示系统中出现了死锁。3) 死锁的解除通常采用的方法是选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的所有的锁,使其它事务得以继续运行下去。当然,对撤消的事务所执行的数据修改操作必须加以恢复。死锁解决方法: 将所有数据一次性加锁降低了并发度。 预先规定一个封锁顺序。 诊断法:检测是否有死锁发生,如有则设法解除。 故障的种类1事务内部的故障事务内部的故障有的是可以通过事务程序本身发现的,有的是非预期的,不能由事务程序处理的。示例:(通过事务程序本身发现的)银行转帐事务将一笔金额从一个帐户甲转给另一个帐户乙。 数据恢复BEGIN TRANSACTION读帐户甲的余额BALANCE1;BALANCE1 = BALANCE1-AMOUNT; (AMOUNT为转帐金额)IF (BALANCE10) THEN打印金额不足,不能转帐;R
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号