1、第八章 故障恢复与事务处理,本章小结,8.1 事务的基本概念,8.2 数据库恢复概述,8.3 恢复的实现技术,8.4 故障恢复,8.5 事务并发控制,8.6 封锁的粒度,第八章 事务管理,8.1 事务的基本概念 1、事务(Transaction)是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。 事务和程序关系:(1)程序是静止的,事务是动态的。事务是程序的执行而不是程序本身。(2)一个程序可分为多个独立部分同时执行,每一执行则是一个不同的事务,即一个程序中可包含多个事务 事务生成: 用户显式地定义事务 由DBMS按缺省自动划分事务,8.1 事务的基本概念
2、,在SQL语言中,定义事务的语句有三条:BEGIN TRANSACTION 事务开始COMMIT -事务提交ROLLBACK -事务回滚 事务的分类:(1)只读型 SET TRANSACTION READ ONLY (2)读写型 SET TRANSACTION READ WRITE,8.1 事务的基本概念,2、事务的特性(ACID)原子性:要么全做,要么全不做。一致性:事务执行的结果必须使数据库从一个一致性状态变到另一个一致性状态。 隔离性:一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。 持续性:一个事务一旦提交,
3、它对数据库中数据的改变就应该是永久性的。,8.1 事务的基本概念,一个说明ACID特性的例子事务:从帐户A转 $50 到帐户B: 1. read(A) 2. A := A 50 3. write(A) 4. read(B) 5. B := B + 50 write(B)Consistency 事务执行完毕后 A 和 B 帐户金额之和必须保持不变。,8.1 事务的基本概念,Atomicity 事务在步骤3, step 6之间失败, 系统必须确保此更新没有在系统中没有遗留痕迹,否则将导致不一致。Durability 一旦用户被告知事务已经完成 (即转帐成功), 则该事务对数据库所做的更新操作必须是
4、永久性的, 即使出现某些失败的情形.Isolation 若在步骤3, step 6, 有另外一个事务允许存取被部分更新的数据库, 则它将看到一个不一致的数据库。(即A + B 的和小于它应该有的值). 通过串行地执行事务,可以确保隔离性,但是事务的并发执行可以带来更多的好处.,8.1 事务的基本概念,事务的一致性必须建立在用户程序逻辑正确性的基础之上。即:当用户提交事务的时候,必须保证当它运行完毕之际,将数据库保持在一个一致性的状态。DBMS通过恢复机制来确保事务的原子性和永久性。隔离性是通过提供一套并发控制的机制而得以实现。,8.1 事务的基本概念,3、事务的状态,8.1 事务的基本概念,4
5、、更新事务的执行与恢复 更新事务的执行要求:更新事务在活动状态下对数据库的任何修改都不能直接在磁盘中进行,而只能在内存缓冲区中进行。 更新事务的恢复: (1)从活动状态转入失败状态的恢复(2)从局部提交状态转入失败状态的恢复。,8.1 事务的基本概念,5. 事务处理面对的问题和要求。 事务执行期间,数据库可能是不一致的。 事务提交后,数据库必须是一致的。 主要处理两种情况:(1) 多个事务的并发执行:并发控制。 (2) 各类型原因所导致的失败,硬件故障,系统崩溃等:故障恢复。,故障种类:事务故障,系统故障,硬件故障数据库的恢复:指DBMS必须具有把数据库从错误状态恢复到某一已知的正确状态(亦称
6、为一致状态或完整状态)的功能。 数据库恢复原理:冗余 建立冗余数据常用技术:(1) 数据转储(2) 登记日志文,8.2 恢复技术概述,8.3 恢复的实现技术,一、数据转储 1. 数据转储的概念转储即DBA定期地将整个数据库复制到磁带或另一个磁盘上保存起来的过程。这些备用的数据文本称为后备副本或后援副本。,得到 副本,转储,运行事务,数据转储与恢复例,8.3 恢复的实现技术,2、静态转储和动态转储 (1)静态转储:是在系统中无运行事务时进行的转储操作。静态转储得到的一定是一个数据一致性的副本。(2)动态转储:是指转储期间允许对数据库进行存取或修改。后备副本需配合日志文件。 3、海量转储和增量转储
7、 (1)海量转储:每次转储全部数据库。 (2)增量转储:每次只转储上一次转储后更新过的数据。,8.3 恢复的实现技术,二、登记(建立)日志文件1、日志文件的格式和内容日志文件用来记录事务对数据库的更新操作的文件。 日志文件主要有两种格式: 以记录为单位 以数据块为单位,8.3 恢复的实现技术,(1)以记录为单位的日志文件内容:事务开始、结束标记操作对象(表、属性等)更新前、后值 (2)以数据块为单位的日志文件内容:事务标识(标明是那个事务) 操作的类型(插入、删除或修改) 操作对象(记录内部标识) 更新前数据的旧值(对插入操作而言,此项为空值) 更新后数据的新值(对删除操作而言, 此项为空值)
8、,8.3 恢复的实现技术,例:日志文件中的一个日志记录例子事务编号 表 元组标识 属性 更新前 更新后201 *事务开始 201 库存 k102 在库数量 410 310201 应收帐 801-2341233 余额 1000 6000201 *事务提交,8.3 恢复的实现技术,2、日志文件的作用事务故障恢复和系统故障必须用日志文件。 在动态转储方式中必须建立日志文件,后援副本和日志文件综合起来才能有效地恢复数据库。 在静态转储方式中,也可以建立日志文件。,作用?,8.3 恢复的实现技术,3、登记日志文件 应遵循两条原则: (1)登记的次序严格按并发事务执行的时间次序。 (2)必须先写日志文件,
9、后写数据库。,静态转储,运行事务,登记日志文件,为什么要先写日志文件 写数据库和写日志文件是两个不同的操作 在这两个操作之间可能发生故障 如果先写了数据库修改,而在日志文件中没有登记下这个修改,则以后就无法恢复这个修改了 如果先写日志,但没有修改数据库,按日志文件恢复时只不过是多执行一次不必要的UNDO操作,并不会影响数据库的正确性,8.3 恢复的实现技术,8.4 故障恢复,一、事务故障及恢复 事务故障: 是指事务运行过程中由于种种原因使事务未运行至正常终止点而夭折的情况。如: 运算溢出 死锁而被选中撤销该事务 违反了完整性规则等 事务故障的恢复:(1)反向扫描文件日志,查找该事务的更新操作。
10、(2)对该事务的更新操作执行逆操作。(3)重复(1)、(2)直到遇此事务的开始标记。,8.4 故障恢复,二、系统故障及恢复(软故障) 系统故障:是指造成系统停止运转的任何事件,使得系统要重新启动。 例如,特定类型的硬件错误(CPU故障)、操作系统故障、DBMS代码错误、突然停电等。 系统故障的恢复: 恢复操作: 要撤销故障发生时未完成的事务 重做(REDO)已完成的事务 系统故障的恢复是由系统在重新启动时自动完成的,不需要用户干预。,8.4 故障恢复,三、介质故障(硬故障) 介质故障:是指外存设备故障。如: 磁盘损坏 磁头碰撞盘面 瞬时强磁场干扰 介质故障的恢复:(1)装入最新的数据库后备副本
11、,使数据库恢复到最近一次转储时的一致性状态。(2)装入相应的日志文件副本,重做已完成的事务。介质故障的恢复需要DBA介入。但DBA只需要重装最近转储的数据库副本和有关的各日志文件副本,然后执行系统提供的恢复命令即可,具体的恢复操作仍由DBMS完成。,8.4 故障恢复,四、具有检查点的恢复技术 利用日志文件进行数据库恢复时存在的问题: (1)搜索整个日志文件将耗费大量的时间。 (2)很多需要REDO处理的事务实际上已经将它们的 更新操作结果写到数据库中了,然而恢复子系统又重新执 行了这些操作,浪费了大量时间。 解决:使用检查点方法。当事务T在一个检查点之前提交,T对数据库所做的修 改一定都已经写
12、入数据库,这样,在进行恢复处理时,就 不必对事务T执行REDO操作,从而改善了恢复效率。,8.4 故障恢复,增加:日志文件中的检查点记录 一个重新开始文件并让恢复子系统在登录日志文件期间动态地维护日志。 检查点记录的内容包括:建立检查点时刻所有正在执行的事务清单(Ti)。各事务最近一个日志记录的地址(Di)。,检查点记录,检查点Ci的重新开始记录,8.4 故障恢复,动态维护日志文件的方法是周期性地执行: 建立检查点,保存数据库状态。具体步骤是:将当前所有日志记录写入磁盘日志文件上;在日志文件中写入一个检查点记录; 将当前所有数据记录写入磁盘的数据库中;把检查点记录在日志文件中的地址写入重新开始
13、文件。 恢复系统将根据事务的不同状态采取不同的恢复策略:,在检查点前开始,在 其后且故障点前提交,不重做,8.4 故障恢复,系统使用检查点方法进行恢复的步骤是:从重新开始文件中找到最后一个检查点记录在日志文件中的地址,由该地址在日志文件中找到最后一个检查点记录。由该检查点记录得到检查点建立时刻所有正在执行的事务清单ACTIVE-LIST。从检查点开始正向扫描日志文件如有新开始的事务Tj,把Tj暂时放入UNDO-LIST队列;如有提交的事务Tj,把Tj从UNDO-LIST队列移到REDO-LIST 队列;直到日志文件结束。对UNDO-LIST中的每个事务执行UNDO操作,对REDO-LIST中的
14、每个事务执行REDO操作。,8.4 故障恢复,五、数据库镜像 根据DBA的要求,自动把整个数据库或其中的关键数据复制到另一个磁盘上。DBMS自动保证镜像数据与主数据的一致性。 作用: 一旦出现介质故障,可由镜像磁盘继续提供使用,同时DBMS自动利用镜像磁盘数据进行数据库的恢复,不需要关闭系统和重装数据库副本。,在没有出现故障时,数据库镜像还可以用于并发操作,即当一个用户对数据加排它锁修改数据时,其他用户可以读镜像数据库上的数据,而不必等待该用户释放锁。,8.4 故障恢复,图8.6 数据库镜像,镜像,DB,8.5 事务并发控制,并发操作在多用户共享系统中,多个用户同时存取同一数据的情形称为并发操
15、作。 并发操作的优点: 增加了处理器和磁盘的可用性, 加大事务吞吐量(throughput):一个事务使用CPU时,另外一个事务读写磁盘 降低平均事务响应时间: 短事务不需要等待长事务 并发操作可能带来的问题:(1)破坏数据库的一致性(2)破坏事务的隔离性,8.5.1 三类数据不一致性,并发操作带来的三类数据不一致性:1. 更新丢失T1、T2读入同一数据并修改,T2提交的结果破坏了T1提交的结果。,A=16,甲事务,乙事务,A=15,8.5.1 三类数据不一致性,2不可重读T1读数据后,T2执行更新操作,使T1无法再现前一次读取结果。,B=100,甲事务,乙事务,B=100,不可重读包括三种情
16、况:(1) 某事务两次读同一数据时,得到的值不同。(2)某事务再次按相同条件读取数据时,发现记录丢失。(3)某事务再次按相同条件读取数据时,发现多了记录。,8.5.1 三类数据不一致性,3脏读T1修改数据并写回磁盘,T2读取同一数据后,T1被撤销即数据恢复原值,T2读的数据与DB中的不一致,称“脏”数据。并发控制方法:封锁,C=100,甲事务,乙事务,C=200,C=100,“脏”数据,什么是封锁? 封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁 加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。 封锁是实现并
17、发控制的一个非常重要的技术,8.5.2 封锁,8.5.2 封锁,两种基本的封锁类型 排它锁(X锁或写锁): 保证其他事务在T释放A上的锁之前,不能再读取和修改A。,共享锁(S锁或读锁): 保证其他事务可以读A,但在T释放A上的S锁之前,不能对A做任何修改。,数据 对象A,事务T,T可读、不可改A,数据 对象A,事务T,T可读、修改A,8.5.2 封锁,一级封锁:没有丢失修改数据,8.5.2 封锁,二级封锁:读脏数据,8.5.2 封锁,三级封锁:可重读,8.5.3 活锁与死锁,活锁:使某个事务永远处于等待状态,而得不到执行的现象称为活锁。,等待,数据 R,避免活锁的方法:先来先服务。,8.5.3
18、 活锁与死锁,死锁:,数据 R1,数据 R2,请求加锁,8.5.3 活锁与死锁,1、死锁的预防 (OS中预防死锁的方法) (1)一次加锁法要求每个事务必须一次将所要使用的数据全部加锁。一次封锁法存在的问题: 降低并发度。因为将以后可能要用到的全部数据加锁,势必将扩大封锁的范围,延长封锁的时间,从而降低了系统的并发度。,8.5.3 活锁与死锁,(2)顺序封锁法预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。顺序封锁法存在的问题:维护成本高:数据库系统中可封锁的数据对象极其众多,并且随数据的插入、删除等操作而不断地变化,要维护这样极多而且变化的资源的封锁顺序非常困难,成本很高 难于实
19、现:事务的封锁请求可以随着事务的执行而动态地决定,很难事先确定每一个事务要封锁哪些对象,因此也就很难按规定的顺序去施加封锁。例:规定数据对象的封锁顺序为A,B,C,D,E。事务T3起初要求封锁数据对象B,C,E,但当它封锁了B,C后,才发现还需要封锁A,这样就破坏了封锁顺序.,8.5.3 活锁与死锁,关于死锁预防的结论 在操作系统中广为采用的预防死锁的策略并不很适合数据库的特点 DBMS在解决死锁的问题上更普遍采用的是诊断并解除死锁的方法:允许死锁发生,由DBMS的并发控制子系统定期检测系统中是否存在死锁,一旦检测到死锁,再设法解除。,8.5.3 活锁与死锁,2、死锁的诊断(1)超时法事务等待
20、时间超过规定时限,就认为发生了死锁。时限长短。(2)等待图法 检测事务等待图中是否存在回路。事务为节点,两个事务之间的等待关系为边。 3、死锁的解除选择一个处理代价最小的事务,将其撤消,释放此事务持有的所有锁。,8.5.4 并发调度的可串行化,封锁是并发控制的一项重要技术,但如下问题尚未得到回答: 1. 什么样的并发调度是正确的? 2. 如何保证并发调度是正确的?,8.5.4 并发调度的可串行化,调度:事务的执行次序。 事务执行方式: (1)串行执行 (2)并行执行 串行执行:多个事务依次顺序执行。 并行执行:多个事务按一定的调度策略同时执行。 可串行化调度 :如果一个事务序列并发执行的结果等
21、价于某一个串行执行的结果,称这种调度策略为可串行化的调度。,8.5.4 并发调度的可串行化,例:表8.8的串行调度(T1T2) p251执行结果:A=9000,B=31000; 例:表8.9的串行调度(T2T1)执行结果:A=8000,B=32000; 例:表8.10 并行调度执行结果:A=9000,B=31000;与表8.8的串行调度结果相同,为可串行化调度。 例:表8.11 并行调度执行结果:A=10000,B=22000;与表7.8、7.9的串行调度结果都不同,为不可串行化调度。 注意: (1)一组事务并发调度的正确性准则:可串行化调度。(2)一组事务的可串行化调度不惟一。,8.5.4
22、并发调度的可串行化,保证并发操作调度正确性的方法 封锁方法:两段锁(Two-Phase Locking,简称2PL)协议 时间戳协议,8.5.4 并发调度的可串行化,两段锁协议:指所有事务必须分两个阶段对数据项加锁和解锁。 获得封锁:对任何数据进行读、写操作之前,要申请并获得对该数据的封锁; 释放封锁:释放一个封锁后,事务不再申请和获得任何其他封锁。例如:事务T遵守两段锁协议,其封锁序列是;Slock A Slock B Xlock C Unlock B Unlock A Unlock C|,8.5.4 并发调度的可串行化,例: 事务1的封锁序列: Slock A . Slock B . Xl
23、ock C . Unlock B . Unlock A . Unlock C;事务2的封锁序列: Slock A . Unlock A . Slock B . Xlock C . Unlock C . Unlock B;事务1遵守两段锁协议,而事务2不遵守两段协议。,8.5.4 并发调度的可串行化,并行执行的所有事务均遵守两段锁协议,则对这些事务的所有并行调度策略都是可串行化的。所有遵守两段锁协议的事务,其并行执行的结果一定是正确的 事务遵守两段锁协议是可串行化调度的充分条件,而不是必要条件 可串行化的调度中,不一定所有事务都必须符合两段锁协议。,8.5.4 并发调度的可串行化,两段锁协议与防
24、止死锁的一次封锁法 一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行,因此一次封锁法遵守两段锁协议 但是两段锁协议并不要求事务必须一次将所有要使用的数据全部加锁,因此遵守两段锁协议的事务可能发生死锁,8.5.4 并发调度的可串行化,两段锁协议与三级封锁协议 两类不同目的的协议 两段锁协议 保证并发调度的正确性 三级封锁协议 在不同程度上保证数据一致性(不可重读、脏数据、更新丢失) 遵守第三级封锁协议必然遵守两段协议,T1 Slock B 读B=2 Y=B Xlock AA=Y+1 写回A=3 Unlock B Unlock A,T2Slock A等待等待等待等待等待
25、 Slock A 读A=3 Y=A Xlock B B=Y+1 写回B=4 Unlock B Unlock A,T1 Slock B 读B=2 Y=B Unlock B Xlock AA=Y+1 写回A=3 Unlock A,T2Slock A 等待 等待 等待 等待 Slock A 读A=3 X=A Unlock A Xlock B B=X+1 写回B=4 Unlock B,(a) 遵守两段锁协议,(b) 不遵守两段锁协议,T1Slock B 读B=2 Y=B Unlock BXlock A A=Y+1 写回A=3 Unlock A,(c) 不遵守两段锁协议,8.5.4 并发调度的可串行化,
26、时间戳是事务进入系统的时间 系统时钟 逻辑计数器 W-timesatmp(Q) 成功执行write(Q)事务的最大时间戳 R-timesatmp(Q) 成功执行read(Q)事务的最大时间戳 时间戳协议假设事务Ti发出read(Q)如果TS(Ti)= W-timesatmp(Q) 则执行read操作, R-timesatmp(Q)设为R-timesatmp(Q)和TS(Ti)的最大值,8.5.4 并发调度的可串行化,假设事务Ti发出write(Q)如果TS(Ti) R-timesatmp(Q) ,则Ti产生的值是先前需要的值,且系统已假定该值不会被产生,write操作被拒绝, Ti回滚如果TS
27、(Ti) W-timesatmp(Q) ,Ti写入的值已过时,write操作被拒绝, Ti回滚;否则,执行write操作:将W-timesatmp(Q) 设为TS(Ti)。,8.6 封锁的粒度,封锁粒度:封锁对象的大小。 封锁对象:属性、元组、关系、数据库 封锁粒度与系统的并发度和并发控制的开销密切相关:封锁的粒度越大,并发度越小,系统开销越小;封锁的粒度越小,并发度越高,系统开销越大。 多粒度封锁:一个系统中同时支持多种封锁粒度供不同事务选择的封锁方法。 封锁粒度选择原则: (1)需处理大量元组的事务以关系为封锁粒度。 (2)需处理多个关系的大量元组的事务以数据库为封锁粒度。 (3)处理少量
28、元组的事务以元组为封锁粒度。,8.6 封锁的粒度,一、多粒度封锁 1. 定义多粒度树 四级粒度树,列 列 列 列 ,8.6 封锁的粒度,2. 多粒度树封锁协议 可对多粒度树中的每个结点独立加锁。(注意:自动对其所有后裔结点加同类型的锁。) 多粒度封锁方式:显式封锁和隐式封锁。,显式封锁是应事务的要求直接加到数据对象上的封锁; 隐式封锁是该数据对象没有独立加锁,是由于其上级结点加锁而使该数据对象加上了锁。,数据库,关系R1 关系Rn,元组 元组 元组 元组,列 列 列 列 ,8.6 封锁的粒度,封锁冲突检查:(1)与显示封锁冲突(本结点)(2)显示封锁与隐式封锁的冲突(与上层结点、与下层结点),
29、问题?,检查效率低。,解决?,引进意向锁。,8.6封锁的粒度,二 、 意向锁 意向锁加锁原则:如果对一个结点加意向锁,则说明该结点的下层结点正在被加锁;对任一结点加锁时,必须先对它的上层结点加意向锁。 例如:对任一元组加锁时,必须先对它所在的关系加意向锁。 封锁冲突的检查:本结点、上层结点(不必检查下层结点) 三种常用的意向锁: 1意向共享锁(IS锁)若对一个数据对象加IS锁,表示它的后裔结点拟加S锁。,8.6封锁的粒度,例如:要对某个元组加S锁,则要先对关系和数据库加IS锁。 2意向排它锁(IX锁)若对一个数据对象加锁,表示它的后裔结点拟加X锁。 3共享意向排它锁(SIX锁)若对一个数据对象加SIX锁,表示对它加S锁,再加IX锁,即SIX=S+IX。SIX有什么好处?,8.6封锁的粒度,数据锁的相容矩阵,第八章 事务管理小结,事务的基本概念及ACID特性 恢复的实现技术 1. 数据转储 2. 日志文件-具有检查点的恢复技术 3. 数据库镜像-远程备份 恢复策略 1. 事务故障的恢复 2. 系统故障的恢复 3. 介质故障的恢复(计算机病毒) 封锁的类型(X锁和S锁)及三级封锁协议 并发调度的可串行性 两段锁协议 封锁粒度 1、多粒度封锁 2、意向锁,P331练习 2、8、10,