1、第7章 数据库保护,7.1 安全性保护 7.2 完整性保护 7.3 并发控制 7.4 恢复,7.3 并发控制,对多用户并发存取同一数据的操作加以控制 DBMS必须提供并发控制机制 并发控制机制是衡量一个DBMS性能的重要标志之一,7.3 并发控制,7.3.1 并发控制概述 7.3.2封锁,一、事务,事务是用户定义的一个数据库操作序列,这些操作要么全做,要么全不做,是一个不可分割的工作单位。事务和程序是两个概念 在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序 一个应用程序通常包含多个事务事务是恢复和并发控制的基本单位,事务(续),事务的ACID特性: 原子性(Atomic
2、ity) 一致性(Consistency) 隔离性(Isolation) 持续性(Durability ),1. 原子性,事务是数据库的逻辑工作单位 事务中包括的诸操作要么都做,要么都不做,2. 一致性,事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。 一致性状态:数据库中只包含成功事务提交的结果 不一致状态:数据库中包含失败事务的结果,一致性(续),一致性与原子性是密切相关的。例:银行转帐:从帐号A中取出一万元,存入帐号B。 定义一个事务,该事务包括两个操作 第一个操作是从帐号A中减去一万元 第二个操作是向帐号B中加入一万元 这两个操作要么全做,要么全不做 全做或者全不做,
3、数据库都处于一致性状态。,3. 隔离性,一个事务的执行不能被其他事务干扰 一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。,4. 持续性,持续性也称永久性(Permanence) 一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。,二、 并发操作与数据的不一致性,例:飞机订票系统中的一个活动序列:1)甲售票员读出某航班的机票余额A,设A=162)乙售票员读出同一航班的机票余额A,也为163)甲售票点卖出一张机票,修改机票余额AA-1,所以A=15,把A写回数据库4)乙售票点也卖出一张机票,修改机票余额AA-1,所以A=15,把A写回数据库结果:
4、卖出两张机票,但数据库中机票余额只减少1。 这种情况称为数据库的不一致性。,并发控制概述(续),产生原因 由甲乙两个售票员并发操作引起 甲事务的修改被丢失。因为第4步中乙事务修改A并写回后覆盖了甲事务的修改,并发控制概述(续),并发操作带来的数据不一致性 丢失修改 不可重复读 读“脏”数据,1. 丢失修改,事务1与事务2从数据库中读入同一数据并修改 事务2的提交结果破坏了事务1提交的结果导致事务1的修改被丢失。,图 三种数据不一致性,(a) 丢失修改,2. 不可重复读,事务1读取数据 之后,事务2执行更新操作从而使事务1无法再现前一次读取结果。,图 三种数据不一致性(续),(b) 不可重复读,
5、3. 读“脏”数据,事务1修改某一数据,并将其写回磁盘 事务2读取同一数据 之后,事务1由于某种原因被撤消,这时事务1已修改过的数据恢复原值 事务2读到的数据就与数据库中的数据不一致,是不正确的数据,又称为“脏”数据。,图 三种数据不一致性(续),(c) 读“脏”数据,保证并发操作正确性,保证并发操作正确性的方法 封锁方法:两段锁协议,7.3.2 封锁,封锁就是事务T在对某个数据对象(例如表、记录等)操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其它的事务不能更新此数据对象。封锁是实现并发控制的一个非常重要的技术,7.3.2.1 封锁类
6、型,DBMS通常提供了多种类型的封锁。一个事务对某个数据对象加锁后究竟拥有什么样的控制是由封锁的类型决定的。基本封锁类型 排它锁(记为X锁) 共享锁(记为S锁),封锁类型(续),排它锁 排它锁又称为写锁。 若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。,封锁类型(续),共享锁 共享锁又称为读锁。 若事务T对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。,封锁类型(续),7.3.2.2 封锁粒度,X锁和S锁都是加在某一个数据对象上的。封锁的对象可以是逻辑单元,也可以是物理单元。逻辑单元: 属
7、性值、属性值集合、元组、关系、索引项、整个索引、整个数据库等 物理单元:页(数据页或索引页)、块等,封锁粒度(续),封锁对象可以很大也可以很小例: 对整个数据库加锁对某个属性值加锁封锁对象的大小称为封锁的粒度,封锁粒度(续),封锁的粒度越大,系统中能够被封锁的对象就越少,并发度也就越小,但系统开销也越小; 封锁的粒度越小,并发度越高,但开销也就越大。选择封锁粒度时必须同时考虑开销和并发度两个因素,进行权衡,以求得最优的效果。,封锁粒度(续),一般原则 需要处理大量元组的用户事务:以关系为封锁单元; 需要处理多个关系的大量元组的用户事务:以数据库为封锁单位; 只处理少量元组的用户事务:以元组为封
8、锁单位,7.3.2.3 封锁协议,什么是封锁协议 对数据对象加锁时,需要约定一些规则。 何时申请X锁或S锁 持锁时间 何时释放,两段锁协议,可串行性是并行调度正确性的唯一准则,两段锁协议就是为保证并行调度可串行性而提供的封锁协议。两段锁协议的内容 1. 在对任何数据进行读、写操作之前,事务首先要获得对该数据的封锁 2. 在释放一个封锁之后,事务不再获得任何其他封锁。,两段锁协议(续),例: 事务1的封锁序列: Slock A . Slock B . Xlock C . Unlock B . Unlock A . Unlock C;事务2的封锁序列: Slock A . Unlock A . S
9、lock B . Xlock C . Unlock C . Unlock B;事务1遵守两段锁协议,而事务2不遵守两段协议。,两段锁协议(续),并行执行的所有事务均遵守两段锁协议,则对这些事务的所有并行调度策略都是可串行化的。所有遵守两段锁协议的事务,其并行执行的结果一定是正确的。,死锁,封锁技术可以有效地解决并行操作的一致性问题,但也带来死锁的问题,死锁,什么是死锁T1 T2,Xlock R1 . . . Xlock R2 等待 等待 等待 .,. . Xlock R2 . . Xlock R1 等待 等待 .,死锁(续),如何解决死锁解决死锁的两类方法 1. 死锁的预防 2. 死锁的诊断与
10、解除,死锁的预防(续),预防死锁的方法一次封锁法顺序封锁法,(1)一次封锁法,一次封锁法要求每个事务必须一次将所有要使用的数据全部加锁,否则就不能继续执行。一次封锁法存在的问题:降低并发度扩大封锁范围 一次就将以后要用到的全部数据加锁,势必扩大了封锁的范围,从而降低了系统的并发度。,(2)顺序封锁法,顺序封锁法是预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁。顺序封锁法存在的问题维护成本高 数据库系统中可封锁的数据对象极其众多,并且随数据的插入、删除等操作而不断地变化,要维护这样极多而且变化的资源的封锁顺序非常困难,成本很高。,死锁的预防(续),结论 在操作系统中广为采用的预防死
11、锁的策略并不很适合数据库的特点 DBMS在解决死锁的问题上更普遍采用的是诊断并解除死锁的方法,2. 死锁的诊断与解除,方法 由DBMS的并发控制子系统定期检测系统中是否存在死锁,一旦检测到死锁,就要设法解除。,死锁的诊断与解除(续),检测死锁超时法 如果一个事务的等待时间超过了规定的时限,就认为发生了死锁。 优点 实现简单 缺点 有可能误判死锁 时限若设置得太长,死锁发生后不能及时发现,死锁的诊断与解除(续),解除死锁 选择一个处理死锁代价最小的事务,将其撤消,释放此事务持有的所有的锁,使其它事务能继续运行下去。,7.4 恢复,故障是不可避免的 计算机硬件故障 系统软件和应用软件的错误 操作员
12、的失误 恶意的破坏 故障的影响 轻则造成运行事务非正常中断,影响数据库中数据的正确性 重则破坏数据库,使数据库中数据部分或全部丢失。,恢复(续),数据库管理系统对故障的对策 DBMS提供了恢复子系统,用来保证各种故障发生后,能把数据库中的数据从错误状态恢复到某种逻辑一致的状态。即保证各个事务中的操作要么全部完成,要么全部不做。数据库系统所采用的恢复技术是否行之有效是衡量系统性能优劣的重要指标。,7.4.1故障类型,事务故障 系统故障 介质故障,一、事务故障,什么是事务故障 某个事务在运行过程中由于种种原因未运行至正常终止点 事务故障的常见原因 输入数据有误 运算溢出 违反了某些完整性限制 某些
13、应用程序出错 并行事务发生死锁,事务故障(续),事务故障的恢复事务故障的恢复:事务撤消(UNDO) 恢复程序要在不影响其它事务运行的情况下,强行回滚(ROLLBACK)该事务,即清除该事务对数据库的所有修改,使得这个事务象根本没有启动过一样,二、系统故障,什么是系统故障 由于某种原因造成整个系统的正常运行突然停止,致使所有正在运行的事务都以非正常方式终止。 发生系统故障时,内存中数据库缓冲区的信息全部丢失,但存储在外部存储设备上的数据未受影响,系统故障(续),系统故障的常见原因 操作系统或DBMS代码错误 操作员操作失误 特定类型的硬件错误(如CPU故障) 突然停电,系统故障(续),系统故障的
14、恢复 1. 清除尚未完成的事务对数据库的所有修改 如果DBMS无法确定哪些事务已更新过数据库,则系统重新启动后,恢复程序要强行撤消(UNDO)所有未完成事务,使这些事务象没有运行过一样。2. 将已完成事务提交的结果写入数据库 如果DBMS无法确定哪些事务的提交结果尚未写入物理数据库,则系统重新启动后,恢复程序需要重做(REDO)所有已提交的事务。,三、介质故障,什么是介质故障 硬件故障使存储在外存中的数据部分丢失或全部丢失 介质故障比前两类故障的可能性小得多,但破坏性最大。,介质故障(续),介质故障的常见原因 硬件故障 磁盘损坏 磁头碰撞 操作系统的某种潜在错误 瞬时强磁场干扰,介质故障(续)
15、,介质故障的恢复 装入数据库发生介质故障前某个时刻的数据副本 重做自此时始的所有成功事务,将这些事务已提交的结果重新记入数据库,故障的种类小结,数据库系统中各类故障对数据库的影响 数据库本身被破坏(介质故障) 数据库处于不一致状态 数据库中包含了未完成事务对数据库的修改(事务故障、系统故障) 数据库中丢失了已提交事务对数据库的修改(系统故障)不同类型的故障应采用不同的恢复操作,故障的种类小结(续),恢复操作的基本原理:简单 原理:利用存储在系统其它地方的冗余数据来重建数据库中已经被破坏或已经不正确的那部分数据恢复的实现技术:复杂 一般一个大型数据库产品,恢复子系统的代码要占全部代码的10%以上
16、,7.4.2 恢复的实现技术,恢复机制涉及的关键问题 1. 如何建立冗余数据 数据转储 登记日志文件 2. 如何利用这些冗余数据实施数据库恢复,7.4.2.1 数据转储,一、什么是转储 二、转储的用途 三、转储方法,一、什么是转储,转储是指DBA将整个数据库复制到磁带或另一个磁盘上保存起来的过程。这些备用的数据文本称为后备副本或后援副本。,二、转储的用途,用途:供介质故障恢复时使用 一旦系统发生介质故障,数据库遭到破坏,可以将后备副本重新装入,把数据库恢复起来。恢复的程度 重装后备副本只能将DB恢复到转储时的状态 要想恢复到故障发生时的状态,必须重新运行自转储以后的所有更新事务,三、转储方法,
17、1静态转储与动态转储 2海量转储与增量转储 3转储方法小结,1静态转储与动态转储,静态转储 静态转储是在系统中无运行事务时进行的转储操作 转储操作开始的时刻,数据库处于一致性状态 转储期间不允许(或不存在)对数据库的任何存取、修改活动静态转储得到的一定是一个数据一致性的副本,静态转储与动态转储(续),静态转储的优点 实现简单静态转储的缺点 降低了数据库的可用性 转储必须等待用户事务结束才能进行 新的事务必须等待转储结束才能执行,静态转储与动态转储(续),利用静态转储得到的副本进行故障恢复 只需要把静态转储得到的后备副本装入,就能把数据库恢复到转储时刻的正确状态,静态转储与动态转储(续),动态转
18、储 动态转储是指转储操作与用户事务并发进行,转储期间允许对数据库进行存取或修改。动态转储的优点 不用等待正在运行的用户事务结束 不会影响新事务的运行动态转储的缺点 不能保证副本中的数据正确有效,静态转储与动态转储(续),利用动态转储得到的副本进行故障恢复 需要把动态转储期间各事务对数据库的修改活动登记下来,建立日志文件 后备副本加上日志文件才能把数据库恢复到某一时刻的正确状态,2海量转储与增量转储,海量转储 每次转储全部数据库增量转储 只转储上次转储后更新过的数据海量转储与增量转储比较 从恢复角度看,使用海量转储得到的后备副本进行恢复往往更方便 但如果数据库很大,事务处理又十分频繁,则增量转储
19、方式更实用更有效,3转储方法小结,转储方法分类,转储方法小结(续),转储策略 从恢复方便角度看,应经常进行数据转储,制作后备副本。 但转储又是十分耗费时间和资源的,不能频繁进行。 DBA应该根据数据库使用情况确定适当的转储周期和转储方法。例: 每天晚上进行动态增量转储 每周进行一次动态海量转储 每月进行一次静态海量转储,一、日志文件的内容,1. 什么是日志文件 日志文件(log)是用来记录事务对数据库的更新操作的文件。2. 日志文件的格式 以记录为单位的日志文件 以数据块为单位的日志文件,日志文件的内容(续),3. 日志文件内容 各个事务的开始标记(BEGIN TRANSACTION) 各个事
20、务的结束标记(COMMIT或ROLLBACK) 各个事务的所有更新操作,二、日志文件的用途,1用途 进行事务故障恢复 进行系统故障恢复 协助后备副本进行介质故障恢复,日志文件的用途(续),2与静态转储后备副本配合进行介质故障恢复 静态转储的数据已是一致性的数据 如果静态转储完成后,仍能定期转储日志文件,则在出现介质故障重装数据副本后,可以利用这些日志文件副本对已完成的事务进行重做处理,日志文件的用途(续),3与动态转储后备副本配合使用进行介质故障恢复 动态转储机制在转储数据库时,必须同时转储同一时间点的日志文件,后备副本与该日志文件结合起来才能将数据库恢复到一致性状态。 与静态转储一样,如果动
21、态转储完成后,仍能定期转储日志文件,则在做介质故障恢复时,可以利用这些日志文件副本进一步恢复数据库,避免重新运行事务程序。,三、登记日志文件的原则,为保证数据库是可恢复的,登记日志文件时必须遵循两条原则 登记的次序严格按并行事务执行的时间次序 必须先写日志文件,后写数据库 写数据库操作:把对数据的修改写到数据库中 写日志文件操作:把表示这个修改的日志记录写到日志文件,7.4.3 Oracle的恢复技术,ORACLE恢复机制 1. 转储 2. 登记日志文件,Oracle的恢复技术(续),1. 转储 转储后备副本的方法 文件拷贝 EXPORT实用程序 用SQL命令SPOOL 自己编程实现,Orac
22、le的恢复技术(续),重装后备副本的方法 文件拷贝 IMPORT实用程序 SQL*LOADER实用程序 自己编程实现,Oracle的恢复技术(续),2. 登记日志文件 ORACLE V.7以后:REDO日志 + 回滚段,Oracle的恢复技术(续),ORACLE 的恢复技术 REDO日志文件:记录被更新数据的前像和后像 回滚段(Rollback Segment):记录尚未完成的更新事务的更新数据的前像 事务故障恢复 根据回滚段中的数据,撤消该事务的操作,Oracle的恢复技术(续),ORACLE 的恢复技术(续) 系统故障恢复 首先扫描REDO日志文件,重做所有操作,并对更新操作建立回滚段数据
23、。当遇到提交记录,取消相应回滚段中数据。 再根据回滚段中的数据,撤消未正常提交的事务的操作,Oracle的恢复技术(续),ORACLE 的恢复技术(续) 介质故障恢复 重装数据库后备副本文件,恢复到转储时的数据库一致性状态 利用在此之后转储的REDO日志文件副本将数据库恢复到最近点(类似于系统故障恢复),小结,如果数据库只包含成功事务提交的结果,就说数据库处于一致性状态。保证数据一致性是对数据库的最基本的要求。事务是数据库的逻辑工作单位 DBMS保证系统中一切事务的原子性、一致性、隔离性和持续性,小结(续),DBMS必须对事务故障、系统故障和介质故障进行恢复恢复中最经常使用的技术:数据库转储和登记日志文件恢复的基本原理:利用存储在后备副本、日志文件来重建数据库,小结(续),常用恢复技术 事务故障的恢复 UNDO 系统故障的恢复 UNDO + REDO 介质故障的恢复 重装备份并恢复到一致性状态 + REDO,