最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

数据库速成第八章——数据库的管理

IT圈 admin 0浏览 0评论

数据库速成第八章——数据库的管理

目录

一、引言

二、事务的概念

1 定义

2 事务的ACID性质

三、数据库的故障恢复

1 恢复的定义 

2 恢复的实现方法

3 故障类型

3.1 事务故障(对数据库的影响最小)

3.2 系统故障

3.3 介质故障(对数据库的影响最大)

3.4 三种故障由谁恢复

4 故障恢复

4.1 事务故障的恢复

4.2 系统故障的恢复

4.3 介质故障的恢复

四、数据库的并发控制

1 并发操作带来的三个问题

1.1 丢失更新问题

1.2 不一致性分析问题(不可重复读)

1.3 读脏数据问题

2 解决问题的方法:封锁技术(Locking)

2.1 排他型封锁(又称X锁、写锁)

2.2 共享型封锁(又称S锁,读锁)

2.3 封锁的相容矩阵

3 活锁和死锁

3.1 活锁

 3.2 死锁

4 并发事务的可串行化调度

4.1 一些概念

4.2 可串行化的概念

4.3 两段封锁法

五、数据库的完整性

1 概念

2 SQL中的完整性约束

2.1 域约束

2.2 基本表约束

2.3 断言(Assertions)

3 触发器

3.1 触发器的结构

3.2 触发器实例

六、数据库的安全性

1 权限

2 安全性和授权

2.1 视图

2.2 SQL中的用户权限及操作

3 数据加密


一、引言

对数据库的管理主要通过四个方面实现:

  • 恢复
  • 并发控制
  • 完整性
  • 安全性

每一方面构成了DBMS的一个子系统。

二、事务的概念

1 定义

事务(Transaction)的定义:事务是由若干对数据库的操作组成的一个逻辑单位。

宏观上是由程序员写的一条或多条SQL语句的一次执行,微观上是对数据元素的一系列基本操作。

 需要提交和撤销。

且事务是数据库系统运行的最小单位。

事务以BEGIN TRANSACTION语句开始,以COMMIT或ROLLBACK语句结束。

假设银行数据库中有一转账事务T,从账号A转50元到账号B,其操作如下:T: BEGIN TRANSACTION;     /*事务开始语句*/read(A);    /*读取A账号中的总钱数*/
A:=A-50;
write(A);
if(A < 0)    ROLLBACK;    /*如果钱不够,则执行事务回退语句*/
else{read(B);B:=B+50;write(B);COMMIT;    /*事务提交语句*/
}

我们可以看到,ROLLBACK是执行失败的回退,COMMIT是执行成功的提交。

对数据库的访问建立在读和写两个操作的基础上。

读(read):把数据从磁盘中的数据库中读到内存的缓冲区中。

写(write):把数据从内存写回磁盘中。

2 事务的ACID性质

  1. 原子性(Atomicity):一个事务里面包含的所有操作不可分割,要么全部执行,要么什么都不做。
  2. 一致性(Consistency):数据库的一致性,即数据不会因为事务的执行而遭到破坏。
  3. 隔离性(Isolation):在多个事务并发执行时,无论这些事务执行的先后顺序如何,结果都应该是一样的。
  4. 持久性(Durability):一个事务对数据库的更新应永久地反映在数据库中。事务如果COMMIT,则对于数据库的影响应该是持久的。事务如果ROLLBACK,则不应该对数据库有影响。

三、数据库的故障恢复

1 恢复的定义 

数据库的可恢复性:系统能把数据库从被破坏、不正确的状态,恢复到最近一个正确的状态。

由恢复管理子系统来保持事务的原子性和持久性,确保数据不丢失、不破坏。

2 恢复的实现方法

基本原则:冗余,即数据的重复存储

实现冗余的两个方法:转储、建立日志

  • 转储

转储即周期性地对整个数据库进行复制,转储到磁盘或磁带中。

  • 建立日志

记录事务对数据库的每一次操作。以便有案可查。

 日志直接写入介质存储上,会保持正确性。

当事务对数据库进行操作时,先写运行日志,再与数据库缓冲区进行信息交换。(运行记录优先原则)

3 故障类型

3.1 事务故障(对数据库的影响最小)

某个事务自身运行错误所引起的故障。例如存款余额透支、库存量为负、并发事务发生死锁等。

事务故障仅仅影响单个事务

3.2 系统故障

由于掉电、非正常关机等所引起的故障。

系统故障影响正在运行的所有事务,并且主存内容丢失。

3.3 介质故障(对数据库的影响最大)

由于磁盘遭到损坏而产生的故障。

介质故障既影响内存又影响存储介质。

3.4 三种故障由谁恢复

事务故障和系统故障由系统自动进行。介质故障需要配合DBA来进行。

系统故障称为软故障,介质故障称为硬故障。

4 故障恢复

4.1 事务故障的恢复

事务故障可通过撤消事务来恢复。(事务故障只有UNDO)

重做事务可保证已提交事务的持久性,撤销事务则消除未提交事务的影响。

4.2 系统故障的恢复

检查点:在该时刻,DBMS强制使内存中的内容与介质数据库中的内容保持一致。

即:在检查点之前内存中的数据与介质中的数据是保持一致的。

共分为三种情况:(只用看事务的结束时刻位置,即线条的右末端)

  1. 在检查点之前结束的事务不需要恢复,因为已经写回DB。如图中的T1

  2. 在检查点之后,故障点之前结束的事务,需要重做(REDO)。从检查点开始重做。例如T2,T4.

  3. 在故障点之后结束的事务,需要撤销(UNDO)。例如T3,T5.

检查点方法的恢复算法:①建立重做队列和撤销队列。正向扫描日志文件。找出在故障发生前已经提交的事务进入重做队列;找出在故障发生时还未完成的事务,进入撤销队列。

② 对重做队列中的事务进行REDO处理,对撤销队列中的事务进行UNDO处理。

UNDO的方法:反射扫描日志文件,对该事务的更新操作执行逆操作【插入操作相当于做删除操作等】。直到读到此事务的开始标记。事务故障的恢复就完成了。

REDO的方法:正向扫描日志文件,对每一个重做事务重新操作。

4.3 介质故障的恢复

两个重要时刻:检查点和转储点

使用转储的副本(DB Backup Copies)进行恢复。用副本数据库替换原本的数据库。

由于介质故障影响全面,在用副本恢复后还需要依据运行日志进行恢复。

转储点的确定不能过频,也不能过疏。

四、数据库的并发控制

1 并发操作带来的三个问题

三个问题:

  1. 丢失更新问题:事务所作的更新操作因另一事务的操作而丢失。
  2. 不一致分析问题:事务从数据库中读取了处于不一致状态的数据。
  3. 读脏数据问题:一事务取用了别的事务未提交,然后被ROLLBACK的数据。

1.1 丢失更新问题

例子如图:

(这里每一个事务的操作步骤都是:查找,修改,写回)

1.2 不一致性分析问题(不可重复读)

 我们可以看到,事务Ti一共读取了两次数据库中的A和B,在读取的间隙被另一个事务Tj修改了值。因此事务Ti进行了不一致性的分析。

1.3 读脏数据问题

脏数据:在数据库技术中,把未提交的随后撤销的数据称为“脏数据”。(修改完数据后,还没有COMMIT,然后被ROLLBACK的数据)

2 解决问题的方法:封锁技术(Locking)

封锁是实现并发控制的重要技术。是指事务向系统发出对某数据对象加锁的请求,以取得对该对象一定的控制权。

2.1 排他型封锁(又称X锁、写锁)

定义:一个事务对数据加了X锁后,不允许其它事务再对该数据加任何类型的锁。

  • PX协议:事务若要更新数据,则必须先提出对此数据的X封锁请求;未获准则进入等待状态,直到获准为止。
  • PXC协议:在PX协议上再加一条规定:解除X锁的操作合并到事务的结束(COMMIT或ROLLBACK)操作中。

PXC协议可以解决更新丢失问题。(我们可以看到,PXC协议就是操作系统中进程访问临界资源时上的PV锁,而PX协议可能会过早地进行V操作从而导致更新丢失)

例子:

2.2 共享型封锁(又称S锁,读锁)

定义:一个事务对数据加了S锁后,允许其它事务再对该数据加S锁,但在S锁解除之前不允许任何事务对该事务加X锁。

产生原因:采用X锁的并发控制并发度低,只允许一个事务独占数据。而其它事务只能排队等待。

  • PS协议:事务要操作数据,则先提出对数据的S锁请求;未获准则等待。在此基础上,或事务想更新数据,则要把S锁升级为X锁。
  • PSC协议:在PS协议的基础上,增加:对S锁的解除应该合并到事务的结束操作中。

PSC协议可以解决丢失更新、读脏数据和不一致分析问题。(三个问题都能解决了)

例子:

 可以看出,获准了S锁,只能读数据,而不能写数据。若要写数据,则要把S锁升级为X锁。

且升级的前提是,其它的S锁均已解锁(和COMMIT操作同步)。

2.3 封锁的相容矩阵

如果事务T1对数据先上锁,则事务T2需要遵守相容矩阵对数据进行操作。 

3 活锁和死锁

使用封锁技术,可以避免并发操作引起的各种错误,但也可能产生活锁和死锁。

3.1 活锁

定义:出现某个事务永远处于等待状态得不到执行的现象。

例子:

 3.2 死锁

定义:出现若干事务因循环等待而无法继续执行的现象。

例子:两个事务T1和T2已分别封锁了数据A和B。T1和T2在保持原有资源的基础上又分别申请封锁B和A,但是由于B和A已被对方封锁,因而T1和T2只能等待。 而T1和T2由于等待封锁而不能结束,从而使对方的封锁申请也永远不能被选中,这就形成了死锁。

死锁的诊断:可以用事务依赖图的形式测试系统中是否存在死锁。

图中,事务T1需要数据B,但B已被事务T2封锁。那么从T1到T2画一个箭头;同理,从T2到T1画一个箭头。如果在事务依赖图中沿着箭头方向存在一个循环,那么系统进入死锁状态。

4 并发事务的可串行化调度

4.1 一些概念

  • 调度:事务的执行次序称为调度。
  • 串行调度:多个事务依次执行,则称为事务的串行调度。事务的串行调度结果都被认为是正确的。
  • 并发调度:得用分时的方法 ,同时处理多个事务,称为并发调度。并发调度不一定是正确的,有可能产生前面提到的不一致性问题。

 如果有n个事务串行调度,可有n!种不同的有效调度。(全排列)

如果有n个事务并发调度,可能的并发调度数目远远大于n!。其中有的调度是正确的,有的是不正确的。产生正确的并发调度,是由DBMS的并发控制子系统实现的。

4.2 可串行化的概念

可串行化是针对于并发调度来说的,如果一个并发调度的执行结果与某一串行调度的执行结果等价,那么这个并发调度称为“可串行化的调度”。否则是不可串行化的调度。

例子:

一共有两个事务,则共有2!=2种串行调度方法。若先做T1再做T2,则A:3,B:4

若先做T2再做T1,则A:12,B:11

以上是两种串行调度,它们都被认为是正确的。是一种衡量并发调度是否可串行化的标准。

4.3 两段封锁法

两段封锁协议规定所有的事务应遵守下面两条规则:

  1. 在对任何一个数据进行读写操作之前,事务必须获得对该数据的封锁。
  2. 在释放一个封锁之后,事务不能再获得任何其它封锁。

两段封锁协议与可串行化之间的关系:

若所有的事务都遵守两段封锁协议,则所有可能的并发调度都是可串行化的。

即:两段封锁是可串行化的充分非必要条件。

两段封锁协议仍可能导致死锁的发生。

五、数据库的完整性

1 概念

完整性的定义:指数据的正确性、有效性和相容性。防止错误的数据进入数据库。

完整性规则的组成:触发条件,约束条件,否则子句

完整性规则用DDL(数据定义语言)描述。

2 SQL中的完整性约束

完整性约束分为三大类:域约束、基本表约束、断言

2.1 域约束

施加于某一列上,孤立进行。定义属性的取值范围。

用“CREATE DOMAIN”语句定义新的域,并可出现CHECK子句。

CREATE DOMAIN DEPT CHAR (20) DEFAULT ‘计算机软件’
CONSTRAINT  VALID_ DEPT           /*域约束名字*/
CHECK(VALUE IN (‘计算机科学与技术’,‘计算机软件’));

这里的DEPT是域,和SMALLINT这种是等同的,VALID_DEPT则是域约束。

使用自定义的域:

--使用默认的域
CREATE TABLE S
(......,
SDEPT CHAR(20),
);--使用自己定义的域
CREATE TABLE S
(......,
SDEPT DEPT,
);

2.2 基本表约束

基本表约束施加于table上,涉及到多列。

1)主键约束(实体完整性)

 用PRIMARY KEY关键字来指定主键。

2)外键约束(参照完整性)

  外键的定义形式:

FOREIGN KEY(<列名序列>)
REFERENCES <参照表> [(<列名序列>)]
[ON DELETE<参照动作>]
[ON UPDATE<参照动作>]

外键(FOREIGN KEY)的取值情况只有两种:要么是NULL,要么是参照关系中的主键值。

外键取值只有两种可能:

作为主键的关系称为参照表,作为外键的关系称为依赖表。

当用户的删除或修改操作违反上述规则时,SQL提供了一种方案保持约束(参照动作)。

如果要删除某个参照表中的主键值,有五种参照动作:

NO ACTION(无影响)

CASCADE(级联方式):将依赖表中的外键值一起删除

RESTRICT(受限方式):不影响依赖表时,才能从参照表中删除

SET NULL(置空值):删除后均在两表中置空

SET DEFAULT(置缺省值):删除后均在两表中置缺省

3)检查约束(用户自定义完整性)

使用CHECK子句。

这种约束在插入元组或修改元组时,系统会测试新的元组值是否满足条件。如果不满足条件,则拒绝插入或修改操作。

2.3 断言(Assertions)

如果完整性约束与多个关系有关,或者与聚合操作有关,则可以使用断言。

/*定义*/
CREATE ASSERTION ASSE1 CHECK (条件)/*撤消*/
DROP ASSERTION ASSE1

断言的CHECK后面一共只有两种形式:>=ALL 和 NOT EXISTS

例题:设有三个关系模式:

EMP(ENO,ENAME,AGE,SEX,ECITY) 

COMP(CNO,CNAME,CITY)           

WORK(ENO,CNO,SALARY)          

试用SQL的断言机制定义下列完整性约束:

①每个职工至多可在3个公司兼职工作:

CREATE ASSERTION ASSE1 CHECK
(3 >= ALL(SELECT COUNT(CNO) FROM WORK GROUP BY ENO
));

②每个公司男职工的平均年龄不超过40岁

CREATE ASSERTION ASSE2 CHECK
(40 >= ALL( SELECT AVG(AGE) 
FROM (EMP INNER JOIN WORK ON EMP.ENO = WORK.ENO) TMP 
WHERE SEX = '男' GROUP BY CNO
));

③不允许女职工在建筑公司工作

CREATE ASSERTION ASSE3 CHECK
(NOT EXISTS(SELECT * FROM EMP,COMP,WORK 
WHERE EMP.ENO = WORK.ENO AND WORK.CNO = COMP.CNO
AND SEX = '女' AND CNAME = '建筑公司'
));

断言也可以通过在CREATE TABLE中用检查子句的形式定义,但是检查子句不一定能保证完整性约束彻底实现,而断言能保证不出错

3 触发器

前面提到的约束机制都是被动的约束机制。而触发器是一种主动规则。(Active Rule)

3.1 触发器的结构

触发器(TRIGGER):触发器是一个能由系统自动执行对数据库修改的语句。

触发器由三部分组成:

  1. 事件:事件是指对数据库的插入、删除、修改等操作(即UPDATE,DELETE和INSERT这三种操作)事件的触发还有两个相关的时间:Before和After。Before触发器是在事件发生之前触发,After触发器是在事件发生之后触发。
  2. 条件:判断条件是否满足。若满足条件,则触发器执行相应动作。
  3. 动作:动作即对数据库的操作。动作部分可以有一个或多个SQL语句。

因此触发器又被称为事件——条件——动作规则

3.2 触发器实例

实例1
某单位修改工资原则:如果职工工资修改后仍低于900元,
那么,在修改后的工资基础上再增加原工资的5%,但不得超过900元。(元组级触发器)CREATE TRIGGER TRIG1AFTER UPDATE OF SALARY ON WORK    /*触发事件*/
REFERENCING     /*设置变量*/OLD AS OLDTUPLENEW AS NEWTUPLEFOR EACH ROW    /*元组级触发器必备话语,如果没有这句话,表明触发器对SQL语句的执行结果只执行一次*/WHEN (900 > NEWTUPLE.SALATY)    /*触发条件*/UPDATE WORK    /*触发器动作一*/SET SALARY = NEWTUPLE.SALARY + OLDTUPLE.SALARY*0.05 WHERE ENO=NEWTUPLE.ENOAND (900 > NEWTUPLE.SALARY + OLDTUPLE.SALARY*0.05);UPDATE WORK    /*触发器动作二*/SET SALARY = 900WHERE ENO = NEWTUPLE.ENOAND(900 <= NEWTUPLE.SALARY + OLDTUPLE.SALATY*0.05);

触发器太难了,等着有机会再细细学吧……

SQL Server使用约束、缺省,规则和触发器4种方法定义和实施数据库完整性功能。

过程数据完整性包括触发器和存储过程等。

六、数据库的安全性

定义:数据库的安全性(Security)是指保护数据库,发免数据的泄密、更改和破坏。

1 权限

用户使用数据库的方式称为权限。

权限的授予、转授与回收

授权:可根据需要把在某对象上的某些权限授予特定用户。

转授:若拥有转授权,则允许把自己已获得的权限再转授给其它用户。

回收:可以撤消已授给某用户的权限。

访问数据的权限:增删改读

修改数据库结构的权限:索引权限、资源权限、修改权限、撤销权限

2 安全性和授权

安全性由两个机制提供:视图和授权子系统。

2.1 视图

视图是虚表,视图机制使DBS具有:数据安全性、逻辑独立性和操作简便性

用户只能使用视图定义中的数据,而不能使用视图定义外的其它数据,从而保证数据的安全性。

2.2 SQL中的用户权限及操作

SQL中共有六类权限供用户使用:

SELECT,INSERT,DELETE,UPDATE,REFERENCES和USAGE

前四类允许用户增删改查,REFERENCES允许用户引用其它关系的主键作为外键。

USAGE允许用户使用已定义的域。

授权(GRANT)语句和回收(REVOKE)语句

GRANT语法:

GRANT<权限表> ON <数据库元素>

          TO<用户名表>

         [ WITH GRANT OPTION];

其中,WITH GRANT OPTION为可选项。表明获得规定权限的用户不仅自己可以执行这些操作,还可以将这些权限授予其他用户。

直接看例子:

例1    把对关系S的查询、修改权限授给用户WANG,
并且WANG还可以把这些权限转授给其他用户:
GRANT SELECT,UPDATE ON S TO WANG
WITH GRANT OPTION例2    允许用户BAO建立新关系时可以引用关系C的主键CNO作为新关系的外键,
并有转让权限:
GRANT REFERENCES (CNO) ON C TO BAO
WITH GRANT OPTION例3    允许所有用户使用已定义过的域COLOR(PUBLIC表示所有用户)
GRANT USAGE ON DOMAIN COLOR TO PUBLIC

  REVOKE语句的格式为:  

         REVOKE <权限表> ON <数据库元素>

         FROM<用户名表> [RESTRICT|CASCADE]

注意:

1)只有使用GRANT授出了权限的用户(及DBA)才能使用本语句收回自己授出去的权限。

2)若被回收的用户使用了WITH GRANT OPTION子句,则其它间接收到此权限的用户也会被回收(CASCADE)、或此REVOKE语句执行失败(RESTRICT)。

例1    从用户WANG连锁回收对关系S的查询、修改权限
REVOKE SELECT,UPDATE ON S FROM WANG CASCADE例2    从LOU回收对关系SPJ的插入(只能插入SNO,PNO,JNO)权限
且如果LOU将权限转授给其它人,则不回收。
REVOKE INSERT(SNO,PNO,JNO) ON SPJ FROM LOU RESTRICT例3    从BAO那里回收他对关系P中主键PNO引用的转授权
REVOKE GRANT OPTION FOR REFERENCES(PNO) ON P FROM BAO

3 数据加密

数据存储和传输时采用加密技术。

输入是明文和加密密钥,输出是密文。只有掌握解密密钥的人,才能解出明文。

总结:

数据的安全性和完整性是两个不同的概念。 数据的安全性是防止数据库被恶意破坏和非法存取,而数据完整性是为了防止错误信息的输入,保证数据库中的数据符合应用环境的语义要求。 安全性措施的防范对象是非法用户和非法操作,而完整性措施的防范对象是不合语义的数据。

数据库速成第八章——数据库的管理

目录

一、引言

二、事务的概念

1 定义

2 事务的ACID性质

三、数据库的故障恢复

1 恢复的定义 

2 恢复的实现方法

3 故障类型

3.1 事务故障(对数据库的影响最小)

3.2 系统故障

3.3 介质故障(对数据库的影响最大)

3.4 三种故障由谁恢复

4 故障恢复

4.1 事务故障的恢复

4.2 系统故障的恢复

4.3 介质故障的恢复

四、数据库的并发控制

1 并发操作带来的三个问题

1.1 丢失更新问题

1.2 不一致性分析问题(不可重复读)

1.3 读脏数据问题

2 解决问题的方法:封锁技术(Locking)

2.1 排他型封锁(又称X锁、写锁)

2.2 共享型封锁(又称S锁,读锁)

2.3 封锁的相容矩阵

3 活锁和死锁

3.1 活锁

 3.2 死锁

4 并发事务的可串行化调度

4.1 一些概念

4.2 可串行化的概念

4.3 两段封锁法

五、数据库的完整性

1 概念

2 SQL中的完整性约束

2.1 域约束

2.2 基本表约束

2.3 断言(Assertions)

3 触发器

3.1 触发器的结构

3.2 触发器实例

六、数据库的安全性

1 权限

2 安全性和授权

2.1 视图

2.2 SQL中的用户权限及操作

3 数据加密


一、引言

对数据库的管理主要通过四个方面实现:

  • 恢复
  • 并发控制
  • 完整性
  • 安全性

每一方面构成了DBMS的一个子系统。

二、事务的概念

1 定义

事务(Transaction)的定义:事务是由若干对数据库的操作组成的一个逻辑单位。

宏观上是由程序员写的一条或多条SQL语句的一次执行,微观上是对数据元素的一系列基本操作。

 需要提交和撤销。

且事务是数据库系统运行的最小单位。

事务以BEGIN TRANSACTION语句开始,以COMMIT或ROLLBACK语句结束。

假设银行数据库中有一转账事务T,从账号A转50元到账号B,其操作如下:T: BEGIN TRANSACTION;     /*事务开始语句*/read(A);    /*读取A账号中的总钱数*/
A:=A-50;
write(A);
if(A < 0)    ROLLBACK;    /*如果钱不够,则执行事务回退语句*/
else{read(B);B:=B+50;write(B);COMMIT;    /*事务提交语句*/
}

我们可以看到,ROLLBACK是执行失败的回退,COMMIT是执行成功的提交。

对数据库的访问建立在读和写两个操作的基础上。

读(read):把数据从磁盘中的数据库中读到内存的缓冲区中。

写(write):把数据从内存写回磁盘中。

2 事务的ACID性质

  1. 原子性(Atomicity):一个事务里面包含的所有操作不可分割,要么全部执行,要么什么都不做。
  2. 一致性(Consistency):数据库的一致性,即数据不会因为事务的执行而遭到破坏。
  3. 隔离性(Isolation):在多个事务并发执行时,无论这些事务执行的先后顺序如何,结果都应该是一样的。
  4. 持久性(Durability):一个事务对数据库的更新应永久地反映在数据库中。事务如果COMMIT,则对于数据库的影响应该是持久的。事务如果ROLLBACK,则不应该对数据库有影响。

三、数据库的故障恢复

1 恢复的定义 

数据库的可恢复性:系统能把数据库从被破坏、不正确的状态,恢复到最近一个正确的状态。

由恢复管理子系统来保持事务的原子性和持久性,确保数据不丢失、不破坏。

2 恢复的实现方法

基本原则:冗余,即数据的重复存储

实现冗余的两个方法:转储、建立日志

  • 转储

转储即周期性地对整个数据库进行复制,转储到磁盘或磁带中。

  • 建立日志

记录事务对数据库的每一次操作。以便有案可查。

 日志直接写入介质存储上,会保持正确性。

当事务对数据库进行操作时,先写运行日志,再与数据库缓冲区进行信息交换。(运行记录优先原则)

3 故障类型

3.1 事务故障(对数据库的影响最小)

某个事务自身运行错误所引起的故障。例如存款余额透支、库存量为负、并发事务发生死锁等。

事务故障仅仅影响单个事务

3.2 系统故障

由于掉电、非正常关机等所引起的故障。

系统故障影响正在运行的所有事务,并且主存内容丢失。

3.3 介质故障(对数据库的影响最大)

由于磁盘遭到损坏而产生的故障。

介质故障既影响内存又影响存储介质。

3.4 三种故障由谁恢复

事务故障和系统故障由系统自动进行。介质故障需要配合DBA来进行。

系统故障称为软故障,介质故障称为硬故障。

4 故障恢复

4.1 事务故障的恢复

事务故障可通过撤消事务来恢复。(事务故障只有UNDO)

重做事务可保证已提交事务的持久性,撤销事务则消除未提交事务的影响。

4.2 系统故障的恢复

检查点:在该时刻,DBMS强制使内存中的内容与介质数据库中的内容保持一致。

即:在检查点之前内存中的数据与介质中的数据是保持一致的。

共分为三种情况:(只用看事务的结束时刻位置,即线条的右末端)

  1. 在检查点之前结束的事务不需要恢复,因为已经写回DB。如图中的T1

  2. 在检查点之后,故障点之前结束的事务,需要重做(REDO)。从检查点开始重做。例如T2,T4.

  3. 在故障点之后结束的事务,需要撤销(UNDO)。例如T3,T5.

检查点方法的恢复算法:①建立重做队列和撤销队列。正向扫描日志文件。找出在故障发生前已经提交的事务进入重做队列;找出在故障发生时还未完成的事务,进入撤销队列。

② 对重做队列中的事务进行REDO处理,对撤销队列中的事务进行UNDO处理。

UNDO的方法:反射扫描日志文件,对该事务的更新操作执行逆操作【插入操作相当于做删除操作等】。直到读到此事务的开始标记。事务故障的恢复就完成了。

REDO的方法:正向扫描日志文件,对每一个重做事务重新操作。

4.3 介质故障的恢复

两个重要时刻:检查点和转储点

使用转储的副本(DB Backup Copies)进行恢复。用副本数据库替换原本的数据库。

由于介质故障影响全面,在用副本恢复后还需要依据运行日志进行恢复。

转储点的确定不能过频,也不能过疏。

四、数据库的并发控制

1 并发操作带来的三个问题

三个问题:

  1. 丢失更新问题:事务所作的更新操作因另一事务的操作而丢失。
  2. 不一致分析问题:事务从数据库中读取了处于不一致状态的数据。
  3. 读脏数据问题:一事务取用了别的事务未提交,然后被ROLLBACK的数据。

1.1 丢失更新问题

例子如图:

(这里每一个事务的操作步骤都是:查找,修改,写回)

1.2 不一致性分析问题(不可重复读)

 我们可以看到,事务Ti一共读取了两次数据库中的A和B,在读取的间隙被另一个事务Tj修改了值。因此事务Ti进行了不一致性的分析。

1.3 读脏数据问题

脏数据:在数据库技术中,把未提交的随后撤销的数据称为“脏数据”。(修改完数据后,还没有COMMIT,然后被ROLLBACK的数据)

2 解决问题的方法:封锁技术(Locking)

封锁是实现并发控制的重要技术。是指事务向系统发出对某数据对象加锁的请求,以取得对该对象一定的控制权。

2.1 排他型封锁(又称X锁、写锁)

定义:一个事务对数据加了X锁后,不允许其它事务再对该数据加任何类型的锁。

  • PX协议:事务若要更新数据,则必须先提出对此数据的X封锁请求;未获准则进入等待状态,直到获准为止。
  • PXC协议:在PX协议上再加一条规定:解除X锁的操作合并到事务的结束(COMMIT或ROLLBACK)操作中。

PXC协议可以解决更新丢失问题。(我们可以看到,PXC协议就是操作系统中进程访问临界资源时上的PV锁,而PX协议可能会过早地进行V操作从而导致更新丢失)

例子:

2.2 共享型封锁(又称S锁,读锁)

定义:一个事务对数据加了S锁后,允许其它事务再对该数据加S锁,但在S锁解除之前不允许任何事务对该事务加X锁。

产生原因:采用X锁的并发控制并发度低,只允许一个事务独占数据。而其它事务只能排队等待。

  • PS协议:事务要操作数据,则先提出对数据的S锁请求;未获准则等待。在此基础上,或事务想更新数据,则要把S锁升级为X锁。
  • PSC协议:在PS协议的基础上,增加:对S锁的解除应该合并到事务的结束操作中。

PSC协议可以解决丢失更新、读脏数据和不一致分析问题。(三个问题都能解决了)

例子:

 可以看出,获准了S锁,只能读数据,而不能写数据。若要写数据,则要把S锁升级为X锁。

且升级的前提是,其它的S锁均已解锁(和COMMIT操作同步)。

2.3 封锁的相容矩阵

如果事务T1对数据先上锁,则事务T2需要遵守相容矩阵对数据进行操作。 

3 活锁和死锁

使用封锁技术,可以避免并发操作引起的各种错误,但也可能产生活锁和死锁。

3.1 活锁

定义:出现某个事务永远处于等待状态得不到执行的现象。

例子:

 3.2 死锁

定义:出现若干事务因循环等待而无法继续执行的现象。

例子:两个事务T1和T2已分别封锁了数据A和B。T1和T2在保持原有资源的基础上又分别申请封锁B和A,但是由于B和A已被对方封锁,因而T1和T2只能等待。 而T1和T2由于等待封锁而不能结束,从而使对方的封锁申请也永远不能被选中,这就形成了死锁。

死锁的诊断:可以用事务依赖图的形式测试系统中是否存在死锁。

图中,事务T1需要数据B,但B已被事务T2封锁。那么从T1到T2画一个箭头;同理,从T2到T1画一个箭头。如果在事务依赖图中沿着箭头方向存在一个循环,那么系统进入死锁状态。

4 并发事务的可串行化调度

4.1 一些概念

  • 调度:事务的执行次序称为调度。
  • 串行调度:多个事务依次执行,则称为事务的串行调度。事务的串行调度结果都被认为是正确的。
  • 并发调度:得用分时的方法 ,同时处理多个事务,称为并发调度。并发调度不一定是正确的,有可能产生前面提到的不一致性问题。

 如果有n个事务串行调度,可有n!种不同的有效调度。(全排列)

如果有n个事务并发调度,可能的并发调度数目远远大于n!。其中有的调度是正确的,有的是不正确的。产生正确的并发调度,是由DBMS的并发控制子系统实现的。

4.2 可串行化的概念

可串行化是针对于并发调度来说的,如果一个并发调度的执行结果与某一串行调度的执行结果等价,那么这个并发调度称为“可串行化的调度”。否则是不可串行化的调度。

例子:

一共有两个事务,则共有2!=2种串行调度方法。若先做T1再做T2,则A:3,B:4

若先做T2再做T1,则A:12,B:11

以上是两种串行调度,它们都被认为是正确的。是一种衡量并发调度是否可串行化的标准。

4.3 两段封锁法

两段封锁协议规定所有的事务应遵守下面两条规则:

  1. 在对任何一个数据进行读写操作之前,事务必须获得对该数据的封锁。
  2. 在释放一个封锁之后,事务不能再获得任何其它封锁。

两段封锁协议与可串行化之间的关系:

若所有的事务都遵守两段封锁协议,则所有可能的并发调度都是可串行化的。

即:两段封锁是可串行化的充分非必要条件。

两段封锁协议仍可能导致死锁的发生。

五、数据库的完整性

1 概念

完整性的定义:指数据的正确性、有效性和相容性。防止错误的数据进入数据库。

完整性规则的组成:触发条件,约束条件,否则子句

完整性规则用DDL(数据定义语言)描述。

2 SQL中的完整性约束

完整性约束分为三大类:域约束、基本表约束、断言

2.1 域约束

施加于某一列上,孤立进行。定义属性的取值范围。

用“CREATE DOMAIN”语句定义新的域,并可出现CHECK子句。

CREATE DOMAIN DEPT CHAR (20) DEFAULT ‘计算机软件’
CONSTRAINT  VALID_ DEPT           /*域约束名字*/
CHECK(VALUE IN (‘计算机科学与技术’,‘计算机软件’));

这里的DEPT是域,和SMALLINT这种是等同的,VALID_DEPT则是域约束。

使用自定义的域:

--使用默认的域
CREATE TABLE S
(......,
SDEPT CHAR(20),
);--使用自己定义的域
CREATE TABLE S
(......,
SDEPT DEPT,
);

2.2 基本表约束

基本表约束施加于table上,涉及到多列。

1)主键约束(实体完整性)

 用PRIMARY KEY关键字来指定主键。

2)外键约束(参照完整性)

  外键的定义形式:

FOREIGN KEY(<列名序列>)
REFERENCES <参照表> [(<列名序列>)]
[ON DELETE<参照动作>]
[ON UPDATE<参照动作>]

外键(FOREIGN KEY)的取值情况只有两种:要么是NULL,要么是参照关系中的主键值。

外键取值只有两种可能:

作为主键的关系称为参照表,作为外键的关系称为依赖表。

当用户的删除或修改操作违反上述规则时,SQL提供了一种方案保持约束(参照动作)。

如果要删除某个参照表中的主键值,有五种参照动作:

NO ACTION(无影响)

CASCADE(级联方式):将依赖表中的外键值一起删除

RESTRICT(受限方式):不影响依赖表时,才能从参照表中删除

SET NULL(置空值):删除后均在两表中置空

SET DEFAULT(置缺省值):删除后均在两表中置缺省

3)检查约束(用户自定义完整性)

使用CHECK子句。

这种约束在插入元组或修改元组时,系统会测试新的元组值是否满足条件。如果不满足条件,则拒绝插入或修改操作。

2.3 断言(Assertions)

如果完整性约束与多个关系有关,或者与聚合操作有关,则可以使用断言。

/*定义*/
CREATE ASSERTION ASSE1 CHECK (条件)/*撤消*/
DROP ASSERTION ASSE1

断言的CHECK后面一共只有两种形式:>=ALL 和 NOT EXISTS

例题:设有三个关系模式:

EMP(ENO,ENAME,AGE,SEX,ECITY) 

COMP(CNO,CNAME,CITY)           

WORK(ENO,CNO,SALARY)          

试用SQL的断言机制定义下列完整性约束:

①每个职工至多可在3个公司兼职工作:

CREATE ASSERTION ASSE1 CHECK
(3 >= ALL(SELECT COUNT(CNO) FROM WORK GROUP BY ENO
));

②每个公司男职工的平均年龄不超过40岁

CREATE ASSERTION ASSE2 CHECK
(40 >= ALL( SELECT AVG(AGE) 
FROM (EMP INNER JOIN WORK ON EMP.ENO = WORK.ENO) TMP 
WHERE SEX = '男' GROUP BY CNO
));

③不允许女职工在建筑公司工作

CREATE ASSERTION ASSE3 CHECK
(NOT EXISTS(SELECT * FROM EMP,COMP,WORK 
WHERE EMP.ENO = WORK.ENO AND WORK.CNO = COMP.CNO
AND SEX = '女' AND CNAME = '建筑公司'
));

断言也可以通过在CREATE TABLE中用检查子句的形式定义,但是检查子句不一定能保证完整性约束彻底实现,而断言能保证不出错

3 触发器

前面提到的约束机制都是被动的约束机制。而触发器是一种主动规则。(Active Rule)

3.1 触发器的结构

触发器(TRIGGER):触发器是一个能由系统自动执行对数据库修改的语句。

触发器由三部分组成:

  1. 事件:事件是指对数据库的插入、删除、修改等操作(即UPDATE,DELETE和INSERT这三种操作)事件的触发还有两个相关的时间:Before和After。Before触发器是在事件发生之前触发,After触发器是在事件发生之后触发。
  2. 条件:判断条件是否满足。若满足条件,则触发器执行相应动作。
  3. 动作:动作即对数据库的操作。动作部分可以有一个或多个SQL语句。

因此触发器又被称为事件——条件——动作规则

3.2 触发器实例

实例1
某单位修改工资原则:如果职工工资修改后仍低于900元,
那么,在修改后的工资基础上再增加原工资的5%,但不得超过900元。(元组级触发器)CREATE TRIGGER TRIG1AFTER UPDATE OF SALARY ON WORK    /*触发事件*/
REFERENCING     /*设置变量*/OLD AS OLDTUPLENEW AS NEWTUPLEFOR EACH ROW    /*元组级触发器必备话语,如果没有这句话,表明触发器对SQL语句的执行结果只执行一次*/WHEN (900 > NEWTUPLE.SALATY)    /*触发条件*/UPDATE WORK    /*触发器动作一*/SET SALARY = NEWTUPLE.SALARY + OLDTUPLE.SALARY*0.05 WHERE ENO=NEWTUPLE.ENOAND (900 > NEWTUPLE.SALARY + OLDTUPLE.SALARY*0.05);UPDATE WORK    /*触发器动作二*/SET SALARY = 900WHERE ENO = NEWTUPLE.ENOAND(900 <= NEWTUPLE.SALARY + OLDTUPLE.SALATY*0.05);

触发器太难了,等着有机会再细细学吧……

SQL Server使用约束、缺省,规则和触发器4种方法定义和实施数据库完整性功能。

过程数据完整性包括触发器和存储过程等。

六、数据库的安全性

定义:数据库的安全性(Security)是指保护数据库,发免数据的泄密、更改和破坏。

1 权限

用户使用数据库的方式称为权限。

权限的授予、转授与回收

授权:可根据需要把在某对象上的某些权限授予特定用户。

转授:若拥有转授权,则允许把自己已获得的权限再转授给其它用户。

回收:可以撤消已授给某用户的权限。

访问数据的权限:增删改读

修改数据库结构的权限:索引权限、资源权限、修改权限、撤销权限

2 安全性和授权

安全性由两个机制提供:视图和授权子系统。

2.1 视图

视图是虚表,视图机制使DBS具有:数据安全性、逻辑独立性和操作简便性

用户只能使用视图定义中的数据,而不能使用视图定义外的其它数据,从而保证数据的安全性。

2.2 SQL中的用户权限及操作

SQL中共有六类权限供用户使用:

SELECT,INSERT,DELETE,UPDATE,REFERENCES和USAGE

前四类允许用户增删改查,REFERENCES允许用户引用其它关系的主键作为外键。

USAGE允许用户使用已定义的域。

授权(GRANT)语句和回收(REVOKE)语句

GRANT语法:

GRANT<权限表> ON <数据库元素>

          TO<用户名表>

         [ WITH GRANT OPTION];

其中,WITH GRANT OPTION为可选项。表明获得规定权限的用户不仅自己可以执行这些操作,还可以将这些权限授予其他用户。

直接看例子:

例1    把对关系S的查询、修改权限授给用户WANG,
并且WANG还可以把这些权限转授给其他用户:
GRANT SELECT,UPDATE ON S TO WANG
WITH GRANT OPTION例2    允许用户BAO建立新关系时可以引用关系C的主键CNO作为新关系的外键,
并有转让权限:
GRANT REFERENCES (CNO) ON C TO BAO
WITH GRANT OPTION例3    允许所有用户使用已定义过的域COLOR(PUBLIC表示所有用户)
GRANT USAGE ON DOMAIN COLOR TO PUBLIC

  REVOKE语句的格式为:  

         REVOKE <权限表> ON <数据库元素>

         FROM<用户名表> [RESTRICT|CASCADE]

注意:

1)只有使用GRANT授出了权限的用户(及DBA)才能使用本语句收回自己授出去的权限。

2)若被回收的用户使用了WITH GRANT OPTION子句,则其它间接收到此权限的用户也会被回收(CASCADE)、或此REVOKE语句执行失败(RESTRICT)。

例1    从用户WANG连锁回收对关系S的查询、修改权限
REVOKE SELECT,UPDATE ON S FROM WANG CASCADE例2    从LOU回收对关系SPJ的插入(只能插入SNO,PNO,JNO)权限
且如果LOU将权限转授给其它人,则不回收。
REVOKE INSERT(SNO,PNO,JNO) ON SPJ FROM LOU RESTRICT例3    从BAO那里回收他对关系P中主键PNO引用的转授权
REVOKE GRANT OPTION FOR REFERENCES(PNO) ON P FROM BAO

3 数据加密

数据存储和传输时采用加密技术。

输入是明文和加密密钥,输出是密文。只有掌握解密密钥的人,才能解出明文。

总结:

数据的安全性和完整性是两个不同的概念。 数据的安全性是防止数据库被恶意破坏和非法存取,而数据完整性是为了防止错误信息的输入,保证数据库中的数据符合应用环境的语义要求。 安全性措施的防范对象是非法用户和非法操作,而完整性措施的防范对象是不合语义的数据。

发布评论

评论列表 (0)

  1. 暂无评论