1、第五章 数据库保护数据库系统中的数据是由DBMS统一管理和控制的, DBMS必须要对数据库进行监控,以保证数据库中的数 据安全可靠和正确有效。 DBMS对数据库的监控,也 称为对数据库的保护,主要通过五个方面实现:,数据的安全性控制 数据的完整性控制 并发控制 数据库恢复 数据库复制与数据库镜象,5.1 安全性数据库的安全性指保护数据库以防止不合法的使用 所造成的数据泄露、更改或破坏 。5 . 1 . 1 安全性控制的一般方法,用户标识和鉴定存取控制定义视图审计数据加密,1 .用户标识和鉴定。保证用户是合法用户。用户名,口令或其它算法如随机数,计算过程或函数,计算 结果2 .存取控制。保证合法
2、用户进行的是合法操作。在SQL语言中可用GRANT和REVOKE语句来实现授权和收回授权。3 .定义视图。通过为不同的用户定义不同的视图来限制各个用户各自对数据的访问范围,把不允许该用户访问的数据通过视图屏蔽掉。,4 . 审计。也称跟踪审查。系统自动将用户对数据库的所有操作记录在 一个专用的文件中,利用审计可重现对数据库的所有操作,监测可能的不合法行为。5 .数据加密。以密码形式存储和传输数据,用户窃取数据后也只能看到一些无法辨认的二进制代码。,5 . 2 完整性含义:是指数据的正确性和相容性目的:防止向数据库中加入不符合语义的数据完整性和安全性:安全性是防止用户非法使用数据库,其防范对象是
3、非法用户和非法操作。完整性则是防止合法用户使用数据库时向数据库中加入不合语义的数据,其防范对象是不合语义的数据。,5 . 2 . 1 完整性约束条件完整性约束条件作用对象:A 列级 B 元组级 C 关系级三类对象又分为静态和动态两种状态:静态: 反映数据库状态合理性的约束动态: 反映数据库动态变迁的约束完整性约束条件可分六类:1 .静态列级约束。数据的类型、取值范围等 。2 .静态元组级约束。一个元组的各个列之间的约束 关系 。3 .静态关系级约束。实体完整性、参照完整性约束4 .动态列级约束。5 .动态元组级约束。6 .动态关系级约束。,5 . 2 . 2 完整性控制DBMS的完整性控制机制
4、应具有三个方面的功能:(1)定义功能,提供定义完整性约束条件的机制。(2)检查功能,检查用户发出的操作请求是否违背 了完整性约束条件。(3)一旦发现用户的操作请求使数据违背了完整性 约束条件,则应采取一定的动作来保证数据的完整性。完整性控制分为三类:实体完整性参照完整性用户定义的完整性,参照完整性需要注意的几点,2 删除被参照关系的元组时的考虑A 级联删除B 受限删除C 置空值删除,3 修改被参照关系中主码的考虑A 级联修改B 受限修改C 置空值修改,1 插入参照关系的元组时的考虑外码是否可以接受空值,对于学生表和成绩表之间的参照完整性关系设定:,依应用环境的语义来确定:,成绩表中的学号不能为
5、空。 故选择受限插入。,修改(对被参照关系的考虑)当一学生转学,学号发生了修改,成绩表中的学号是否应随之更改呢?,插入(对参照关系的考虑):在成绩表中是否可以插入没有学号的成绩吗?,是的,故选择级联更改。,删除(对被参照关系的考虑)当一个学生中途被学校开除后,个人记录从学生挡案表中欲作删除,他的成绩表是否应随之从表中删除呢?,是的,故选择级联删除,对于课程表和成绩表之间的参照完整性关系设定:,依应用环境的语义来确定:,成绩表中的课号不能为空。 故选择受限插入。,修改(对被参照关系的考虑)学校将课程表中的某一课号作了修改,课名不变,成绩表中的课号是否应随之更改呢?,插入(对参照关系的考虑):在成
6、绩表中是否可以插入没有课号的成绩?,是的,故选择级联更改。,删除(对被参照关系的考虑)学校对课程表的某一课号因内容陈旧欲作删除,成绩表中的课号是否应随之从表中删除呢?,否,故选择受限删除,5.3并发控制(仅针对多用户数据库系统),事务(Transaction)事务是数据库的逻辑工作单位,它是用户定义的一组操作序列。,5.3.1 概述 并发的含义:当由多个用户使用数据库时,就会产 生多个用户同时读写同一数据的情况 DBMS的并发控制是以事务为单位进行的。,事务的四属性:,1 原子性这些操作要么都做,要么都不做是一个不可分割的逻辑工作单位,2 一致性 事务必须是使数据库从一个一致性状态变到另一个一
7、致性状态。 3 隔离性 一个事务的执行不能被其他事务干扰。 4 持续性 也叫永久性,指事务一旦提交,它对数据库中数据的改变就是永久性的。,例1:某人在银行中有A,B两个账号, 若想从账号A中取出一万元,存入账号B 这是一个包括两个操作的“事务“,事务操作1:从账号A中减去一万元操作2:向账号B中加入一万元,这两个操作要么全做,要么全不做, 数据库都处于一致性状态。 如果只做一个操作,数据库就处于不一致性状态。,COMMIT 提交事务,在SQL语言中,定义事务的语句有三条:BEGIN TRANSACTION 开始事务,ROLLBACK 回滚事务,提交(COMMIT)将事务中对数据库的所有操作写到
8、物理数据库,事务正常结束,回滚 (ROLLBACK)事务运行过程中发生故障,撤消已作的所有操作,回滚到事务开始时的状态,例2:总公司-甲售票点,乙售票点 甲售票点读出某航班的机票余数A,设A16。 乙售票点读出同一航班的机票余数A,A16。,事务1 甲售票点卖出一张机票,读取余数A=16修改余数AA-1, A=15,把A写回数据库。,事务2 乙售票点也卖出一张机票,读取余数A=16修改余数AA-1, A=15,把A写回数据库。,操作结果,卖出二张机票而余额只减少1。,并发操作与数据不一致性,并发操作带来的数据不一致性包括三类:A 丢失修改B 不可重复读C 读”脏”数据,检索 读A=50读B=1
9、00求和 C=150 检索(验算) 读 A=50读 B=200求和 C=250,更新 读B=100BB2写回B=200,事务1,事务2,时间,t1t2t3,图5-5 不可重复读,怎么才能避免上述三种情况发生?原因何在?,5.3.2并发操作的调度 并行事务正确性的唯一准则:可串行化调度 对于串行调度,各事务的操作没有交叉,也就没有 互相干扰,当然不会产生上述的并发引起的诸多问题,因此将所有事务串行起来的调度策略一定是正确的调度策略。虽然以不同的顺序串行执行事务也可能会产生不同的结果,但由于不会将数据库置于不一致状态,所以都可以认为是正确的。,产生上述三类数据不一致性的原因是并发操作破坏 了事务的
10、隔离性。如何保证并行事务的正确性或事 务的一致性?,几个事务的并行执行是正确的, 当且仅当其结果与按某一次序串行地 执行它们时的结果相同。,5.3.3 封锁(Locking) 目前DBMS普遍采用封锁的方法以保证调度的正确性,是一种非常重要的实现并发控制的技术。,封锁就是事务T向系统发出请求, 对某个数据对象(最常用的是记录)加锁。 于是事务T对这个数据对象就有一定的控制, 在事务T释放它的锁之前,其他的事务不能更新 此数据对象,锁的类型 排它锁(写锁) X (eXclude) 独占,其他锁加不上 共享锁(读锁) S (Share) 读相容,写锁加不上,1 . 排它锁(exclusive lo
11、ck)排它锁简称X锁,也叫写锁。若事务T对数据对象A 加上X锁,则允许T读取和修改A,其它任何事务都不能 对A再加任何类型的锁,直到T释放A上的锁。从而保证 了其它事务在T释放A上的锁之前不能再读取和修改A。2 . 共享锁(share lock)也叫S锁或读锁。若事务T对数据对象A加上S锁, 则其它事务只能再对A加S锁,而不能加X锁,直到T释 放A上的S锁。这就保证了其它事务可以读A,但在T释 放A上的S锁之前不能对A做任何修改,故S锁是读相容 的。排它锁和共享锁的控制方式可由下面的相容矩阵表 示: T1T2 X S X N N YS N Y Y Y Y Y,封锁对象的粒度封锁对象可以是属性值
12、、属性值集合、元组、关系、整个数据库。封锁对象的大小称为封锁粒度。,一般以封锁元组、关系为多。,封锁协议封锁协议,是对一定粒度的数据对象加锁时,还需约定一些规则,如:应何时申请X锁或S锁、持锁时间、何时释放等,称这些规则为封锁协议。对封锁方式规定不同的规则,就形成各种不同的封 锁协议,它们分别在不同的程度上为并发操作的正确调 度提供一定的保证。1 .保证数据一致性的封锁协议三级封锁协议(1)1级封锁协议内容:事务T在修改数据A之前必须对其加X锁,直到事务结束才释放。1级封锁协议可防止丢失修改。,XLOCK A读A=16 AA-1写回 A=15COMMIT UNLOCK A,XLOCK A加锁不
13、成功,等待 XLOCK A 读 A=15AA-1写回 A=14COMMITUNLOCK A,事务1,事务2,时间,t1t2t3t4t5,图5-9 没有丢失修改,(2) 2级封锁协议内容: 1级封锁协议加上事务T在读取数据A 之前必须先对其加S锁,读完后即可释放S锁。2级封锁协议除防止丢失修改,还可进一步防 止读“脏”数据。,XLOCK C读C=100CC2写回C=200 ROLLBACKC恢复为100UNLOCK C,SLOCK C加锁不成功,等待 SLOCK C读C=100UNLOCK C,事务1,事务2,时间,t1t2t3t4,图5-10 不再读”脏”数据,(3) 3级封锁协议内容: 1级
14、封锁协议加上事务T在读取数据A之前必须先对其加S锁,直到事务结束才释放。此协议除防止丢失修改和不读“脏”数据外,还进一步防止了不可重复读。,SLOCK A读A=50SLOCK B读B=100求和C=150 检索(验算)读A=50,读B=100求和C=150COMMITUNLOCK AUNLOCK B,XLOCK B 加锁不成功,等待 XLOCK B读B=100B=B2写回B=200COMMITUNLOCK B,事务1,事务2,时间,t1t2t3t4,图5-11 可重复读,请参照表5-6 (P169),2. 保证并行调度可串行性的封锁协议两段锁协议,A 在对任何数据进行读、写操作之前,事务首先要
15、获得对该数据的封锁,(第一段 加锁),B 在释放一个封锁之后,事务不再获得任何其他封锁。(第二段 释放锁),T1:lock(A)lock(C)lock(B)unlock(C)unlock (A)unlock (B) 获得封锁(锁增长阶段)释放封锁(锁缩减阶段) 显然事务T2是非两段事务T2:lock(A)lock(B) unlock(A) lock(C)unlock (B)unlock (C),5.3.4活锁和死锁,活锁锁的类型分为S锁和X锁两种, S锁是读锁,若有一事务对某一数据对象A加S锁,则其它事务也只能对A加S锁,而不能加X锁。若事务T1对A加了S锁,而在T1对A释放S锁之前,事务TW
16、申请对A加X锁,则TW只能等待,而在TW等待期间,若不断有事务申请对A加S锁,凡申请加S锁的均可获准,这样数据对象A始终被S锁占有, TW只有当所有申请加S锁的事务都释放对A的S锁后, TW才可获准对A加X锁。这种现象叫活锁(live lock)。,5.3.4活锁和死锁,活锁活锁虽不会导致“死等”,但对系统的性能具有不良的影响。为避免活锁,在加锁协议中,应规定“先申请,先服务”(first come first served)的原则。这样比X锁后申请的S锁就不会先于X锁获准了。,死锁死锁表示事务为了加锁永远处于等待状态, 没有可能等到了加锁的机会。,事务T1封锁了数据对象Xlock R1后,
17、事务T2请求封锁数据对象Xlock R2, 事务T1也请求封锁R2,T1等待T2释放R2, 事务T2也请求封锁R1,T2等待T1释放R1需由DBMS进行干预。DBMS在解决死锁的问题上,普遍采用的是诊断并解除死锁的办法。,5.4 恢复,起因:因故障造成运行事务的非正常中断,而影响数据库中数据的正确性,含义:在发生故障后,数据库中的数据能从错误状态恢复到逻辑一致的状态,恢复的实现技术:数据转储登记日志文件,数据转储A DBA(Database Administrator)定期地将整个数据库复制到磁带或另一个磁盘上保存起来。B备用的数据文本称为后备副本或后援副本。当数据库遭到破坏后就可以利用后备副本把数据库恢复到转储时的状态。 登记日志文件A 日志文件是用来记录对数据库每一次更新活动的文件B 当数据库恢复到转储结束时刻的正确状态,然后利用 日志文件,就可把数据库恢复到故障前某一时刻的正确状态,