【文档说明】《数据库系统原理与应用》第6章--数据库的事务处理与数据恢复课件.ppt,共(54)页,1.426 MB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-92255.html
以下为本文档部分文字说明:
第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事务(Trans
action)的概念事务是用户定义的数据库操作序列,这些操作可作为一个完整的工作单元。一个事务内的所有语句是一个整体,要么全部执行,要么全部不执行。即事务是不可再分的原子性工作。如在银行业务中,“从帐户A转移资金X到
帐户B”就是一个典型的事务。这个事务可以分解为两个动作:(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)一致性(Consistency)。(3)隔离性(Isolation)。(4)持久性(Durability)。上述的四个特性也简称为ACID特性,保
证ACID特性是事务处理的重要任务。事务的ACID特性可能遭到破坏的原因有:1)多个事务并行运行时,不同事务的操作交叉执行。2)事务在运行过程中被强迫停止。返回本节6.1.4SQLServer中的事务SQLServer的事务分为两种类型:系统提供的事务和用户定义的事务。系统提供的事务是指在执
行某些语句时,一条语句就是一个事务,它的数据对象可能是一个或多个表(视图),可能是表(视图)中的一行数据或多行数据;用户定义的事务以BEGINTRANSACTION语句开始,以COMMIT或ROLLBACK结束。其中:BEGINTR
ANSACTION:事务的开始标记。COMMITTRANSACTION:事务的结束标记。OLLBACKTRANSACTION:回滚。返回本节6.2并发控制6.2.1并发操作引起的问题6.2.2封锁6.2.3封锁出现的问题及解决方法6.2.4可串行化调度6.2.5
SQLServer的并发控制机制返回首页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,所以A=14,把A写入数据库。并发操作如果不加以控制,就可能引发下列数据的不一致性:1.丢失修改(LostUpdate)2.不可重复读(Unrepeata
bleRead)3.读“脏”数据(DirtyRead)1.丢失修改(LostUpdate)丢失修改是指事务T1与事务T2从数据库中读入同一数据并修改,事务T2提交的修改结果破坏了事务T1提交的修改结果,导致事务T1的修
改被丢失。丢失修改的情况如图6-2所示。调度时刻事务T1事务T2t1读A=16t2读A=16t3A=A-1写回A=15t4A=A-2写回A=14(覆盖了T1对A的修改)图6-2丢失修改2.不可重复读(UnrepeatableRead)即事务T1两次读取同一数
据项A的内容不一致。究其原因,是在两次读操作之间,事务T2也修改了数据项A。不可重复读的情况如图6-3所示。调度时刻事务T1事务T2t1读A=50读B=100求和=150t2读B=100B←B*2写回B=200t3
读A=50读B=200求和=250(验算不对)图6-3不可重复读3.读“脏”数据(DirtyRead)即事务T1读取了经过事务T2修改过的数据,但是由于事务T2因为流产而撤消了对该数据的修改,数据库恢复到事务T2执行前的状态,从而导致事务T1读取的
内容与数据库中的内容不一致。读“脏”数据的情况如图6-4所示。调度时刻事务T1事务T2t1读B=100B←B*2写回B=200t2读B=200(读入T2的脏数据)t3ROLLBACK(B恢复为100)图6
-4读“脏”数据返回本节6.2.2封锁1.封锁的类型DBMS通常提供了多种类型的封锁。一个事务对某个数据对象加锁后究竟拥有什么样的控制是由封锁类型决定的。基本的封锁类型有两种:排它锁(ExclusiveLock,简称X锁)和共享锁(ShareLock
,简称为S锁)。(1)排它锁。(2)共享锁。2.保证数据一致性的封锁协议——三级封锁协议所谓封锁协议就是在对数据库加锁、持锁和释放锁时所约定的一些规则。例如,应何时申请X锁或S锁、持锁时间、何时释放等。不
同的封锁规则形成了不同的封锁协议,下面介绍三级封锁协议。(1)一级封锁协议。(2)二级封锁协议。(3)三级封锁协议(1)一级封锁协议。一级封锁协议是事务T在修改数据之前必须先对其加X锁,直到事务结束才释放。一级封锁协议可有效防止丢失修改
,并保证事务T是可恢复的。例如,图6-6使用一级封锁协议解决了图6-2中的丢失修改问题。调度时刻事务T1事务T2t1获得XlockAt2读A=16XlockA等待t3A=A-1写回A=15CommitUnloc
kA等待等待等待t4获得XlockA读A=15A=A-2写回A=13CommitUnlockA图6-6没有丢失修改(2)二级封锁协议。二级封锁协议是在一级封锁协议加上事务T对要读取的数据加S锁,读完后即可释放S锁。二级封锁协议
除防止了丢失修改还可进一步防止读“脏”数据。例如,图6-7使用二级封锁协议解决了图6-4中读“脏”数据的问题。调度时刻事务T1事务T2t1XlockB读B=100B←B*2写回B=200t2SlockB等待t3ROLLBACK(B恢复为100)Unl
ockBt4获得SlockB读B=100UnlockB图6-7不读“脏”数据(3)三级封锁协议。三级封锁协议是事务T在读取数据之前必须先对其加S锁,在要修改数据之前必须先对其加X锁,直到事务结束后才释放所有的锁。例如图6-8使用了三级
封锁协议解决了图6-3中的不可重复读问题。调度时刻事务T1事务T2t1SlockA读A=50SlockB读B=100求和=150t2XlockB等待t3读A=50读B=100求和=150CommitUnlockAUnlockB等待t4获得Xlock读B=100B←B*2写回B=200Co
mmitUnlockB图6-8可重复读封锁协议X锁S锁不丢失修改不读脏数据可重复读一级事务全程加锁不加锁√二级事务全程加锁事务开始加锁,读完即释放√√三级事务全程加锁事务全程加锁√√√表6-1不同级别
的封锁协议返回本节6.2.3封锁出现的问题及解决方法1.活锁在多个事务请求对同一数据封锁时,总是使某一事务等待的情况称为活锁。例如:如果事务T1封锁了数据R后,T2也请求封锁R,于是T2等待。接着T3也请求封锁R。假如T1释放R上的锁后,系统首先批准了T3的请求,T2只得继续等待
。接着T4也请求封锁R,T3释放R上的锁后,系统又批准了T4的请求,……,T2有可能就这样永远等待下去。2.死锁多个并发事务处于相互等待的状态,其中的每一个事务都在等待它们中的另一个事务释放封锁,这样才可以继续执
行下去,但任何一个事务都没有释放自己已获得的锁,也无法获得其他事务已拥有的锁,所以只好相互等待下去,这就产生了死锁。调度时刻事务T1事务T2t1XlockAt2XlockBt3XlockB等待t4XlockA等待…图6-9死锁目前在数据库
中解决死锁问题主要有两类方法,一类方法是采取一定措施来预防死锁的发生,另一类方法是允许发生死锁,然后采用一定手段定期诊断系统中有无死锁,若有则解除之。(1)死锁的预防。1)一次封锁法。2)顺序封锁法。(2)
死锁的检测与解除。返回本节6.2.4可串行化调度所谓的两段锁协议是指所有事务必须分两个阶段对数据项进行加锁和解锁。具体体现在:(1)在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁;(2)释放一个封锁之后,事务不再申请并获得
对任何数据的封锁。所谓两段锁的含义是:事务分为两个阶段,第一阶段是获得封锁,也称为扩展阶段。在这个阶段,事务可以申请获得任何数据项上的任何类型的锁,但不能释放任何锁。第二阶段是释放封锁,也称为收缩阶段。在这个阶段,事务可以释放任何数据项上的任何类型的锁,但是不
能申请任何锁。返回本节6.2.5SQLServer的并发控制机制1.SQLServer的空间管理及锁的级别2.SQLServer锁的类型1.SQLServer的空间管理及锁的级别(1)行和行级锁。(2)页和页级锁。(3)簇
和簇级锁。(4)表级锁。(5)数据库级锁。2.SQLServer锁的类型一般情况下,SQLServer能自动提供加锁功能,而不需要用户专门设置,这些功能表现在:(1)当使用SELECT语句访问数据库时,系统能自动用共享
锁访问数据;在使用INSERT、UPDATE和DELETE语句增加、修改和删除数据时,系统回自动给使用数据加排它锁。(2)系统可用意向锁使锁之间的冲突最小化。意向锁建立一个锁机制的分层结构,其结构按行级锁层和表级锁层设置。(3)当系统修改一个页时,会自
动加修改锁。修改锁和共享锁兼容,而当修改了某页后,修改锁会上升为排它锁。(4)当操作涉及到参考表或者索引时,SQLServer会自动提供模式稳定锁和模式修改锁。返回本节6.3数据库恢复6.3.1数据库系统的故障6.3.2数据库备份技术6.3.3数据库
恢复策略6.3.4SQLServer的数据备份和恢复返回首页6.3.1数据库系统的故障1.事务故障2.系统故障3.介质故障返回本节6.3.2数据库备份技术1.数据转储2.日志文件1.数据转储(
1)静态转储和动态转储。1)静态转储是在系统中没有运行其他事务时进行的转储操作。2)动态转储是指转储操作与用户事务并发进行,转储期间允许对数据库进行存取或修改。(2)海量转储和增量转储。海量转储是指每次转储全部数据库。增量转储是指转储上次转储后更新过的数据。2.日志文件(1)日志文件的
格式和内容。各个事务的开始(BEGINTRANSACTION)标记。事务标识(标明是哪个事务)。操作的类型(插入、删除或修改)。操作对象。更新前数据的旧值(对插入操作而言,此项为空值)。更新后数据的新值(对删除操作而言,此项
为空值)。各个事务的结束(COMMIT或ROLLBACK)标记。(2)登记日志文件。返回本节6.3.3数据库恢复策略1.事务故障的恢复具体的恢复步骤为:(1)反向扫描文件日志(即从最后向前扫描日志文件),查找该事务的更新操作。(2)对该事务的更新操作执行逆操
作。(3)重复执行(1)和(2),恢复该事务的其他更新操作,直至读到此事务的开始标记,事务故障恢复就完成了。2.系统故障的恢复具体的恢复步骤为:(1)正向扫描日志文件(即从头扫描日志文件),找出在故障发生前已经提交的
事务(这些事务既有BERGINTRANSACTION记录,也有COMMIT记录),将其事务标识记入重做(REDO)队列。(2)对撤消队列中的各个事务进行撤消(UNDO)处理。(3)对重做队列中的各个事务进行重做(R
EDO)处理。3.介质故障的恢复介质故障是指磁盘上的物理数据和日志文件均遭破坏,这是最严重的一种故障。恢复方法是首先重装数据库,使数据库管理系统能正常运行,然后利用介质损坏前对数据库已做的备份恢复数据库。具体的恢复步骤为:(1)装入最新的后备数据库副本,使数据库恢复到最近一次转储时的
一致性状态。(2)装入相应的日志文件副本(转储结束时刻的日志文件的副本),重做已完成的事务。返回本节6.3.4SQLServer的数据备份和恢复SQLServer具有比较强大的数据备份和恢复功能,提供了海量备份和增量备份、静态备份和动态备份等多种备份方式
,并具有日志和检查点两种数据恢复技术。用户可以使用Transact-SQL语句,也可以通过SQLServer的EnterpriseManager进行数据备份和数据恢复。SQLServer2000提供了四种数据库备份与恢复数据的方式:全库备份:备份整个数据库。日
志备份:备份日志文件。差异备份:仅备份自上次全库备份后被修改过的数据页。文件或文件组备份:对组成数据库的文件或文件组进行单独的备份。例6-1对BOOKSYS数据库做一次全库备份。备份(BACKUP)语句如下:BACKUPDATABASEBOOKSYS/*对BOOKSYS数据库进行备
份*/TO"MYBAK"/*备份设备为MYBAK*/WITHINIT,/*此设备将覆盖以前所有的备份*/NAME='BOOKSYSBAK'/*备份的名字为BOOKSYSBAK*/例6-2对BOOKSYS数据库做一次差异备份。备份(BACKUP)语句如下:BAC
KUPDATABASEBOOKSYS/*对BOOKSYS数据库进行备份*/TO"MYBAK"/*备份设备为MYBAK*/WITHDIFFERENTIAL,/*差异备份*/NOINTI,/*新备份的数据库将添加到备份设备原备份内容的后面*/NAME='BOOKSYSBAK'/*备份
的名字为BOOKSYSBAK*/例6-3对BOOKSYS数据库做一次日志备份。备份(BACKUP)语句如下:BACKUPLOGBOOKSYS/*对BOOKSYS进行日志备份*/TO"MYBAK"/*备份设备为MYBAK*/WITHNOINIT,/*新备份的数
据库将添加到备份设备原备份内容的后面*/NAME='BOOKSYSBAK'/*备份的名字为BOOKSYSBAK*/返回本节小结本章介绍了事务的相关概念、并发控制机制和数据库的备份和恢复技术三大内容。事务在数据库中是非常重要的概念,事务中的
操作是一个完整的工作单元,这些操作或者全部成功,或者全部不成功。并发控制是指当同时执行多个事务时,为了保证一个事务的执行不受其他事务的干扰所采取的措施。并发控制的主要方法是加锁,根据对数据操作的不同,锁分为共享锁和排
它锁两种。为了保证并发执行的事务是正确的,一般要求事务遵守两段锁协议,即在一个事务中明显地分为锁申请期和释放期,它是保证事务是可并发执行的充分条件。