【数据库系统原理与应用】数据库的事务处理与数据恢复.ppt1、第6章数据库的事务处理与数据恢复6.1事务管理的基本概念6.2并发掌握6.3数据库恢复6.1事务管理的基本概念6.1.1事务〔Transaction〕的概念 6.1.2事务的状态 6.1.3事务的特性6.1.4SQLServer中的事务返回首页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〕3、原子性〔Atomicity〕。
〔2〕一致性〔Consistency〕。
〔3〕隔离性〔Isolation〕。
〔4〕长久性〔Durability〕。
上述的四个特性也简称为ACID特性,保证ACID特性是事务处理的重要任务。
事务的ACID特性可能遭到破坏的缘由有:1〕多个事务并行运行时,不同事务的操作交叉执行。
2〕事务在运行过程中被强迫停止。
返回本节6.1.4SQLServer中的事务SQLServer的事务分为两种类型:系统提供的事务和用户定义的事务。
系统提供的事务是指在执行某些语句时,一条语句就是一4、个事务,它的数据对象可能是一个或多个表〔视图〕,可能是表〔视图〕中的一行数据或多行数据;用户定义的事务以BEGINTRANSACTION语句开始,以COMMIT或ROLLBACK结束。
其中:BEGINTRANSACTION:事务的开始标记。
COMMITTRANSACTION:事务的结束标记。
OLLBACKTRANSACTION:回滚。
返回本节6.2并发掌握6.2.1并发操作引起的问题6.2.2封锁6.2.3封锁出现的问题及解决方法6.2.4可串行化调度6.2.5SQLServer的并发掌握机制返回5、首页6.2.1并发操作引起的问题对事务的并发执行假如不加以掌握,可能会导致数据库中数据的不一致性。
一个最常见的并发操作的例子是飞机订票系统中的订票操作。
例如,在该系统中的一个活动的序列:〔1〕事务T1〔动作1〕:甲售票员读出某航班的机票余额A,设A=16。
〔2〕事务T2〔动作1〕:乙售票员读出同一航班的机票余额,A也为16。
〔3〕事务T1〔动作2〕:甲售票员卖出一张机票,修改机票余额A←A-1,所以A=15,把A写入数据库。
〔4〕事务T2〔动作2〕:乙售票员卖出两张机票,修改机票余额A←A-2,所6、以A=14,把A写入数据库。
并发操作假如不加以掌握,就可能引发以下数据的不一致性:1.丢失修改〔LostUpdate〕2.不行重复读〔UnrepeatableRead〕3.读“脏”数据〔DirtyRead〕1.丢失修改〔LostUpdate〕丢失修改是指事务T1与事务T2从数据库中读入同一数据并修改,事务T2提交的修改结果破坏了事务T1提交的修改结果,导致事务T1的修改被丢失。
丢失修改的状况如图6-2所示。
调度时刻事务T1事务T2t1读A=16 t2 读A=16t3A=A-1写回A =15 t4 A7、=A-2写回A=14(覆盖了T1对A的修改)图6-2丢失修改2.不行重复读〔UnrepeatableRead〕即事务T1两次读取同一数据项A的内容不一致。
究其缘由,是在两次读操作之间,事务T2也修改了数据项A。
不行重复读的状况如图6-3所示。
调度时刻事务T1事务T2t1读A=50读B=100求和=150 t2 读B=100B←B*2写回B=200t3读A=50读B=200求和=250〔验算不对〕图6-3不行重复读3.读“脏”数据〔DirtyRead〕即事务T1读取了经过事务T2修改正的数据,但是8、由于事务T2因为流产而撤消了对该数据的修改,数据库恢复到事务T2执行前的状态,从而导致事务T1读取的内容与数据库中的内容不一致。
读“脏”数据的状况如图6-4所示。
调度时刻事务T1事务T2t1 读B=100B←B*2写回B=200t2读B=200(读入T2的脏数据) t3 ROLLBACK(B恢复为100)图6-4读“脏”数据返回本节6.2.2封锁1.封锁的类型DBMS通常提供了多种类型的封锁。
一个事务对某个数据对象加锁后到底拥有什么样的掌握是由封锁类型确定的。
基本的封锁类型有两种:排它锁〔Excl9、usiveLock,简称X锁〕和共享锁〔ShareLock,简称为S锁〕。
〔1〕排它锁。
〔2〕共享锁。
2.保证数据一致性的封锁协议——三级封锁协议所谓封锁协议就是在对数据库加锁、持锁和释放锁时所商定的一些规则。
例如,应何时申请X锁或S锁、持锁时间、何时释放等。
不同的封锁规则形成了不同的封锁协议,下面介绍三级封锁协议。
〔1〕一级封锁协议。
〔2〕二级封锁协议。
〔3〕三级封锁协议〔1〕一级封锁协议。
一级封锁协议是事务T在修改数据之前必需先对其加X锁,直到事务结束才释放。
一级封锁协议可有效防止丢失修改,并10、保证事务T是可恢复的。
例如,图6-6使用一级封锁协议解决了图6-2中的丢失修改问题。
调度时刻事务T1事务T2t1获得XlockA t2读A=16XlockA等待t3A=A-1写回A=15CommitUnlockA等待等待等待t4 获得XlockA读A=15A=A-2写回A=13CommitUnlockA图6-6 没有丢失修改〔2〕二级封锁协议。
二级封锁协议是在一级封锁协议加上事务T对要读取的数据加S锁,读完后即可释放S锁。
二级封锁协议除防止了丢失修改还可进一步防止读“脏”数据。
例如,图6-7使用11、二级封锁协议解决了图6-4中读“脏”数据的问题。
调度时刻事务T1事务T2t1 XlockB读B=100B←B*2写回B=200t2SlockB 等待t3 ROLLBACK(B恢复为100)UnlockBt4获得SlockB读B=100UnlockB 图6-7 不读“脏”数据〔3〕三级封锁协议。
三级封锁协议是事务T在读取数据之前必需先对其加S锁,在要修改数据之前必需先对其加X锁,直到事务结束后才释放全部的锁。
例如图6-8使用了三级封锁协议解决了图6-3中的不行重复读问题。
调度时刻事务T1事务T2t112、SlockA读A=50SlockB读B=100求和=150 t2 XlockB 等待t3读A=50读B=100求和=150CommitUnlockAUnlockB等待t4 获得Xlock读B=100B←B*2写回B=200CommitUnlockB图6-8 可重复读封锁协议X锁S锁不丢失修改不读脏数据可重复读一级事务全程加锁不加锁√二级事务全程加锁事务开始加锁,读完即释放√√三级事务全程加锁事务全程加锁√√√表6-1不同级别的封锁协议返回本节6.2.3封锁出现的问题及解决方法1.活锁在多个事务13、请求对同一数据封锁时,总是使某一事务等待的状况称为活锁。
例如:假如事务T1封锁了数据R后,T2也请求封锁R,于是T2等待。
接着T3也请求封锁R。
假如T1释放R上的锁后,系统首先批准了T3的请求,T2只得继续等待。
接着T4也请求封锁R,T3释放R 上的锁后,系统又批准了T4的请求,……,T2有可能就这样永久等待下去。
2.死锁多个并发事务处于互相等待的状态,其中的每一个事务都在等待它们中的另一个事务释放封锁,这样才可以继续执行下去,但任何一个事务都没有释放自己已获得的锁,也无法获得其他事务已拥有的锁,所14、以只好互相等待下去,这就产生了死锁。
调度时刻事务T1事务T2t1XlockA t2 XlockBt3XlockB等待t4 XlockA等待…图6-9 死锁目前在数据库中解决死锁问题主要有两类方法,一类方法是实行肯定措施来预防死锁的发生,另一类方法是允许发生死锁,然后采纳肯定手段定期诊断系统中有无死锁,若有则解除之。
〔1〕死锁的预防。
1〕一次封锁法。
2〕顺序封锁法。
〔2〕死锁的检测与解除。
返回本节6.2.4可串行化调度所谓的两段锁协议是指全部事务必需分两个阶段对数据项进行加锁和解锁。
具体表达在:〔15、1〕在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁;〔2〕释放一个封锁之后,事务不再申请并获得对任何数据的封锁。
所谓两段锁的含义是:事务分为两个阶段,第一阶段是获得封锁,也称为扩展阶段。
在这个阶段,事务可以申请获得任何数据项上的任何类型的锁,但不能释放任何锁。
第二阶段是释放封锁,也称为收缩阶段。
在这个阶段,事务可以释放任何数据项上的任何类型的锁,但是不能申请任何锁。
返回本节6.2.5SQLServer的并发掌握机制1.SQLServer的空间管理及锁的级别2.SQLServer锁的类16、型1.SQLServer的空间管理及锁的级别〔1〕行和行级锁。
〔2〕页和页级锁。
〔3〕簇和簇级锁。
〔4〕表级锁。
〔5〕数据库级锁。
2.SQLServer锁的类型一般状况下,SQLServer能自动提供加锁功能,而不需要用户特地设置,这些功能表如今:〔1〕当使用SELECT语句访问数据库时,系统能自动用共享锁访问数据;在使用INSERT、UPDATE 和DELETE语句增加、修改和删除数据时,系统回自动给使用数据加排它锁。
〔2〕系统可用意向锁使锁之间的冲突最小化。
意向锁建立一个锁机制的分层结构,其结构17、按行级锁层和表级锁层设置。
〔3〕当系统修改一个页时,会自动加修改锁。
修改锁和共享锁兼容,而当修改了某页后,修改锁会上升为排它锁。
〔4〕当操作涉及到参考表或者索引时,SQLServer会自动提供模式稳定锁和模式修改锁。
返回本节6.3数据库恢复6.3.1 数据库系统的故障 6.3.2数据库备份技术 6.3.3数据库恢复策略6.3.4 SQLServer的数据备份和恢复返回首页 6.3.1 数据库系统的故障1.事务故障2.系统故障3.介质故障返回本节6.3.2数据库备份技术1.数据转储2.日志文件1.数据转储18、〔1〕静态转储和动态转储。
1〕静态转储是在系统中没有运行其他事务时进行的转储操作。
2〕动态转储是指转储操作与用户事务并发进行,转储期间允许对数据库进行存取或修改。