1、第第6章章 数据库的事务处理与数据恢复数据库的事务处理与数据恢复 6.1 事务管理的基本概念 6.2 并发控制 6.3 数据库恢复6.1 事务管理的基本概念事务管理的基本概念 6.1.1 事务(Transaction)的概念 6.1.2 事务的状态 6.1.3 事务的特性 6.1.4 SQL Server中的事务返回首页返回首页6.1.1 事务(事务(Transaction)的概念)的概念 事务是用户定义的数据库操作序列,这些操作可作为一个完整的工作单元。一个事务内的所有语句是一个整体,要么全部执行,要么全部不执行。即事务是不可再分的原子性工作。如在银行业务中,“从帐户A转移资金X到帐户B”就
2、是一个典型的事务。这个事务可以分解为两个动作:(1)从账户A减去金额X。(2)在账户B中加上金额X。返回本节返回本节6.1.2 事务的状态事务的状态事务的基本操作包括:(1)事务开始(BEGIN_TRANSACTION)。事务开始执行。(2)事务读写(Read/Write)。事务进行数据操作。(3)事务结束(END_TRANSACTION)。事务完成所有的读/写操作。(4)事务交付(COMMIT_TRANSACTION)。事务完成所有的读/写操作,并保存操作结果。返回本节返回本节6.1.3 事务的特性事务的特性 事务所必须具有的重要特性包括:(1)原子性(Atomicity)。(2)一致性(C
3、onsistency)。(3)隔离性(Isolation)。(4)持久性(Durability)。上述的四个特性也简称为ACID特性,保证ACID特性是事务处理的重要任务。事务的ACID特性可能遭到破坏的原因有:1)多个事务并行运行时,不同事务的操作交叉执行。2)事务在运行过程中被强迫停止。返回本节返回本节6.1.4 ORACLE中的事务中的事务.在Oracle中没有“开始事务处理”的语句。用户不能显式地开始一个事务处理。事务处理会隐式地开始于第一条修改数据的语句,或者在一些要求事务处理的场合。数据库事务主要由INSERT、UPDATE、DELETE操作组成。当在应用程序中执行第一条SQL时,
4、事务便开始了,当执行COMMIT或ROLLBACK语句时事务就结束了。Oracle中对事务处理的控制语句主要包括COMMIT、ROLLBACK、SAVEPOINT、ROLLBACK TO SAVEPOINT、SET TRANSACTION。(1)提交事务()提交事务(COMMIT)。)。在事务处理中,用户只需要使用COMMIT语句就可以结束事务。当执行COMMIT语句之后,系统确认事务变化、结束事务、删除保存点、释放锁,其他会话就可以查看到事务变化后的新数据了.返回本节返回本节(2)回退事务()回退事务(ROLLBACK)回退可以撤消已进行的操作。当应用中出现错误,或是运行程序的终端用户决定不
5、保存对数据库数据进行的修改时,就需要进行回滚。回滚事务使用ROLLBACK命令。回退终止用户的事务处理,撤消用户已经进行的对数据的所有改变,读取用户存储在回滚段或UNDO表空间中的信息,将数据库块恢复到用户处理之前的状态,且释放会话所占用的所有锁定(3)设置保存点()设置保存点(SAVEPOINT)用户在处理较大事物时中可以建立保存点(SAVEPOINT),用于在必要时取消部分事务。用户可以在单个事物中拥有多个保存点,当使用ROLLBACK TO SAVEPOINT时,可以让用户有选择地回滚到事物处理中的某特定位置.(4)取消部分事务()取消部分事务(ROLLBACK TO SAVEPOINT
6、)为了取消部分事务,可以使用ROLLBACK TO SAVEPOINT命令,也可以调用包dbms_transaction中过程rollback(5)设置事务只读属性)设置事务只读属性 设置事务属性的命令为:SET TRANSACTION READ ONLY 只读事务是指只允许执行查询操作,而不允许执行任何数据更新操作的事务。使用SET TRANSACTION READ ONLY 命令可以确保用户无法执行修改数据的操作,通过设置只读事务,可以有效地将数据库视图冻结到某个时间点。也就是说,无论数据库其他会话如何工作,都不会改变只读事务读到的数据。假定企业需要在每天16点统计最近24小时的销售信息,
7、而不统计当天16点之后的销售信息,那么就可以使用只读事务,在设置了只读事务之后,尽管其他会话可能会提交事务,但只读事务将不会取得新的数据变化,从而确保取得特定时间点的数据信息 6.2 并发控制并发控制 6.2.1 并发操作引起的问题 6.2.2 封锁 6.2.3 封锁出现的问题及解决方法 6.2.4 可串行化调度 6.2.5 ORACLE的并发控制机制返回首页返回首页6.2.1 并发操作引起的问题并发操作引起的问题对事务的并发执行如果不加以控制,可能会导致数据库中数据的不一致性。一个最常见的并发操作的例子是飞机订票系统中的订票操作。例如,在该系统中的一个活动的序列:(1)事务T1(动作1):甲
8、售票员读出某航班的机票余额A,设A=16。(2)事务T2(动作1):乙售票员读出同一航班的机票余额,A也为16。(3)事务T1(动作2):甲售票员卖出一张机票,修改机票余额AA-1,所以A=15,把A写入数据库。(4)事务T2(动作2):乙售票员卖出两张机票,修改机票余额AA-2,所以A=14,把A写入数据库。并发操作如果不加以控制,就可能引发下列数据的不一致性:1丢失修改(Lost Update)2不可重复读(Unrepeatable Read)3读“脏”数据(Dirty Read)1丢失修改(Lost Update)丢失修改是指事务T1与事务T2从数据库中读入同一数据并修改,事务T2提交的
9、修改结果破坏了事务T1提交的修改结果,导致事务T1的修改被丢失。丢失修改的情况如图6-2所示。调度时刻调度时刻事务事务T1事务事务T2t1读读A16 t2 读读A16t3A=A-1写回写回A15 t4 A=A-2写回写回A14(覆盖了覆盖了T1对对A的修改的修改)图图6-2 丢失修改丢失修改 2不可重复读(Unrepeatable Read)即事务T1两次读取同一数据项A的内容不一致。究其原因,是在两次读操作之间,事务T2也修改了数据项A。不可重复读的情况如图6-3所示。调度时刻调度时刻事务事务T1事务事务T2t1读读A50读读B100求和求和150 t2 读读B100BB*2写回写回B=20
10、0t3读读A50读读B200求和求和250(验算不对)(验算不对)图图6-3 不可重复读不可重复读 3读“脏”数据(Dirty Read)即事务T1读取了经过事务T2修改过的数据,但是由于事务T2因为流产而撤消了对该数据的修改,数据库恢复到事务T2执行前的状态,从而导致事务T1读取的内容与数据库中的内容不一致。读“脏”数据的情况如图6-4所示。调度时刻调度时刻事务事务T1事务事务T2t1 读读B100BB*2写回写回B=200t2读读B200(读入读入T2的脏数据的脏数据)t3 ROLLBACK(B恢复为恢复为100)图图6-4 读读“脏脏”数据数据返回本节返回本节6.2.2 封锁封锁 1封锁
11、的类型DBMS通常提供了多种类型的封锁。一个事务对某个数据对象加锁后究竟拥有什么样的控制是由封锁类型决定的。基本的封锁类型有两种:排它锁(Exclusive Lock,简称X锁)和共享锁(Share Lock,简称为S锁)。(1)排它锁。(2)共享锁。2保证数据一致性的封锁协议三级封锁协议所谓封锁协议就是在对数据库加锁、持锁和释放锁时所约定的一些规则。例如,应何时申请X锁或S锁、持锁时间、何时释放等。不同的封锁规则形成了不同的封锁协议,下面介绍三级封锁协议。(1)一级封锁协议。(2)二级封锁协议。(3)三级封锁协议(1)一级封锁协议。一级封锁协议是事务T在修改数据之前必须先对其加X锁,直到事务
12、结束才释放。一级封锁协议可有效防止丢失修改,并保证事务T是可恢复的。例如,图6-6使用一级封锁协议解决了图6-2中的丢失修改问题。调度时刻事务T1事务T2t1获得Xlock A t2读A16Xlock A等待t3A=A-1写回A15CommitUnlock A等待等待等待t4 获得Xlock A读A15A=A-2写回A13CommitUnlock A图图6-6没有丢失修改没有丢失修改(2)二级封锁协议。二级封锁协议是在一级封锁协议加上事务T对要读取的数据加S锁,读完后即可释放S锁。二级封锁协议除防止了丢失修改还可进一步防止读“脏”数据。例如,图6-7使用二级封锁协议解决了图6-4中读“脏”数据
13、的问题。调度时刻调度时刻事务事务T1事务事务T2t1 Xlock B读B100BB*2写回B=200t2SlockB等待 t3 ROLLBACK(B恢复为100)Unlock Bt4获得Slock B读B100Unlock B 图图6-7不读不读“脏脏”数据数据(3)三级封锁协议。三级封锁协议是事务T在读取数据之前必须先对其加S锁,在要修改数据之前必须先对其加X锁,直到事务结束后才释放所有的锁。例如图6-8使用了三级封锁协议解决了图6-3中的不可重复读问题。调度时刻事务T1事务T2t1Slock A读A50Slock B读B100求和150 t2 XlockB等待t3读A50读B100求和15
14、0CommitUnlock AUnlock B等待t4 获得Xlock读B100BB*2写回B=200CommitUnlock B图图6-8可重复读可重复读封锁封锁协议协议X锁锁S锁锁不丢失不丢失修改修改不读脏不读脏数据数据可重可重复读复读一级一级事务全程加锁事务全程加锁不加锁不加锁 二级二级事务全程加锁事务全程加锁事务开始加锁,读完即释放事务开始加锁,读完即释放 三级三级事务全程加锁事务全程加锁事务全程加锁事务全程加锁表表6-1 不同级别的封锁协议不同级别的封锁协议返回本节返回本节6.2.3 封锁出现的问题及解决方法封锁出现的问题及解决方法 1活锁 在多个事务请求对同一数据封锁时,总是使某一
15、事务等待的情况称为活锁。例如:如果事务T1封锁了数据R后,T2也请求封锁R,于是T2等待。接着T3也请求封锁R。假如T1释放R上的锁后,系统首先批准了T3的请求,T2只得继续等待。接着T4也请求封锁R,T3释放R上的锁后,系统又批准了T4的请求,T2有可能就这样永远等待下去。2死锁 多个并发事务处于相互等待的状态,其中的每一个事务都在等待它们中的另一个事务释放封锁,这样才可以继续执行下去,但任何一个事务都没有释放自己已获得的锁,也无法获得其他事务已拥有的锁,所以只好相互等待下去,这就产生了死锁。调度调度 时时刻刻事务事务T1事务事务T2t1Xlock A t2 Xlock Bt3Xlock B
16、等待等待 t4 Xlock A等待等待图图6-9死锁死锁目前在数据库中解决死锁问题主要有两类方法,一类方法是采取一定措施来预防死锁的发生,另一类方法是允许发生死锁,然后采用一定手段定期诊断系统中有无死锁,若有则解除之。(1)死锁的预防。1)一次封锁法。2)顺序封锁法。(2)死锁的检测与解除。返回本节返回本节6.2.4 可串行化调度可串行化调度 所谓的两段锁协议是指所有事务必须分两个阶段对数据项进行加锁和解锁。具体体现在:(1)在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁;(2)释放一个封锁之后,事务不再申请并获得对任何数据的封锁。所谓两段锁的含义是:事务分为两个阶段,第一阶段是
17、获得封锁,也称为扩展阶段。在这个阶段,事务可以申请获得任何数据项上的任何类型的锁,但不能释放任何锁。第二阶段是释放封锁,也称为收缩阶段。在这个阶段,事务可以释放任何数据项上的任何类型的锁,但是不能申请任何锁。返回本节返回本节6.2.5 ORACLE的并发控制机制的并发控制机制 Oracle通过支持事务并发控制机制来管理多个事务,保证事务的一致性,并使用事务日志保证修改的完整性和可恢复性.在通常情况下,数据锁由系统隐含完成,用户不用考虑封锁问题,但Oracle也允许用户用LOCK TABLE命令显式对封锁对象加锁 1Oracle锁的类型锁的类型 Oracle的锁分为两大类:数据锁(DML锁)和字
18、典锁.Oracle的数据锁有5种:共享锁(S锁)、排它锁(X锁),行级共享锁(RS锁)、行级排它锁(RX锁)和共享行级排它锁(SRX锁),其封锁粒度包括行级和表级 2Oracle数据锁的一个特点数据锁的一个特点 在默认情况下,读数据不加锁。也就是说,当一个用户更新数据时,另一个用户可以同时读取相应数据。Oracle通过一个被称之为回滚段的内存结构来保证用户不读“脏”数据和可重复读。这样可以提高数据的并发度 6.3 数据库恢复数据库恢复 6.3.1数据库系统的故障 6.3.2 数据库备份技术 6.3.3 数据库恢复策略返回首页返回首页6.3.1数据库系统的故障数据库系统的故障 1事务故障 2系统
19、故障 3介质故障 返回本节返回本节6.3.2 数据库备份技术数据库备份技术 1数据转储 2日志文件1数据转储数据转储(1)静态转储和动态转储。1)静态转储是在系统中没有运行其他事务时进行的转储操作。2)动态转储是指转储操作与用户事务并发进行,转储期间允许对数据库进行存取或修改。(2)海量转储和增量转储。海量转储是指每次转储全部数据库。增量转储是指转储上次转储后更新过的数据。2日志文件日志文件(1)日志文件的格式和内容。各个事务的开始(BEGIN TRANSACTION)标记。事务标识(标明是哪个事务)。操作的类型(插入、删除或修改)。操作对象。更新前数据的旧值(对插入操作而言,此项为空值)。更
20、新后数据的新值(对删除操作而言,此项为空值)。各个事务的结束(COMMIT或ROLLBACK)标记。(2)登记日志文件。返回本节返回本节6.3.3 数据库恢复策略数据库恢复策略 1事务故障的恢复具体的恢复步骤为:(1)反向扫描文件日志(即从最后向前扫描日志文件),查找该事务的更新操作。(2)对该事务的更新操作执行逆操作。(3)重复执行(1)和(2),恢复该事务的其他更新操作,直至读到此事务的开始标记,事务故障恢复就完成了。2系统故障的恢复具体的恢复步骤为:(1)正向扫描日志文件(即从头扫描日志文件),找出在故障发生前已经提交的事务(这些事务既有BERGIN TRANSACTION 记录,也有C
21、OMMIT记录),将其事务标识记入重做(REDO)队列。(2)对撤消队列中的各个事务进行撤消(UNDO)处理。(3)对重做队列中的各个事务进行重做(REDO)处理。3介质故障的恢复介质故障是指磁盘上的物理数据和日志文件均遭破坏,这是最严重的一种故障。恢复方法是首先重装数据库,使数据库管理系统能正常运行,然后利用介质损坏前对数据库已做的备份恢复数据库。具体的恢复步骤为:(1)装入最新的后备数据库副本,使数据库恢复到最近一次转储时的一致性状态。(2)装入相应的日志文件副本(转储结束时刻的日志文件的副本),重做已完成的事务。返回本节返回本节小结小结 本章介绍了事务的相关概念、并发控制机制和数据库的备份和恢复技术三大内容。事务在数据库中是非常重要的概念,事务中的操作是一个完整的工作单元,这些操作或者全部成功,或者全部不成功。并发控制是指当同时执行多个事务时,为了保证一个事务的执行不受其他事务的干扰所采取的措施。并发控制的主要方法是加锁,根据对数据操作的不同,锁分为共享锁和排它锁两种。为了保证并发执行的事务是正确的,一般要求事务遵守两段锁协议,即在一个事务中明显地分为锁申请期和释放期,它是保证事务是可并发执行的充分条件。