期末复习的时候对课本进行了系统的整理,现在发上来希望能对大家有用www
正文 第1章 引言 数据库系统由一个互相关联的数据的集合和一组用以访问这些数据的程序组成。这个数据的集合通常称作数据库。 DBMS的主要特性关系数据库由表的集合构成,每个表有唯一的名字。表中的一行代表了一组值之间的一种联系。关系指代表,元组指代行,属性表示列。元组的每一个分量都是原子值。关系是笛卡尔积的子集。对每个属性都存在一个允许取值的集合成为该属性的域。如果域中元素被看做是不可再分的单元,则域是原子的。
关系和表的区别:a.在数学上,关系可以是无限的。b.表的属性没有次序,数学上关系列有序。
对关系进行限制:a.令关系元组数目有限 b.赋予关系的列属性名,取消属性之间的次序。 对关系进行限制后,关系=表。
关系的基本特征:行无序,列无序,行不同,列同质,不同列可出自同一域,分量的原子性。
空值的含义:表示值未知或不存在。
2.2 数据库模式关系模式由属性序列及各个属性对应域组成。模式(大写)下可以定义关系变量(小写)。不同关系中的属性名可以相同。
2.3 码超码(superkey)
是一个或多个属性的集合,这些属性的集合能够唯一的表示一个关系中的一个元组。
如果K是一个超码,那么K的任意超集也是超码。
候选码(candidate key)
任意真子集都不能成为超码的最小超码。
主码(primary key)
制定一个候选码作为关系的主码。应稳定、不易修改、切合主体。(加下划线)
码是对关系模式的约束。确定原则:要按照现实世界语义约束定义、不能依据对数据的归纳总结定义。
外码(foreign key)
一个关系模式(r1)可能它的属性中包含另一个关系模式(r2)的主码,这个属性在r1上称作参照r2的外码。关系r1称为外码依赖的参照关系,r2叫做外码的被参照关系。
外码是关系模式的约束,要按照现实世界语义约束定义外码。参照关系和被参照关系可以是同一个表。
参照完整性约束:要求在参照关系中任意元组在特定属性上的取值必然等于被参照关系中某个元组在特定属性上的取值。
一个含有主码和外码依赖的数据库模式可以用模式图来表示。
第3章 SQL 3.1 SQL查询语言概览DDL(数据定义语言)create/drop/alter
DML(数据操纵语言)select/delete/insert/update
DCL(数据控制语言)grant/revoke
事务管理语句:commit/rollback
基本类型:
字符型:char(n),varchar(n)
数字类型:int,smallint,long,numeric(m,n),real,double,precision,float(n)
日期时间型:date,time,timestamp(datetime)
基本模式定义:
(1) create table
create table s
(sno char(2),
sname varchar(8) not null,
sage int ,
primary key(sno),
check(sage between 16 and 30)
);
Primary key(A,A,A)声明主码(实体完整性),必须非空且唯一
Foreign key(A,A,A) references r:声明外码(参照完整性)
Check(条件) 用户自定义完整性
Not null:非空约束
(2) alter table
为已有关系增加或删除属性
Alter table r add A D;所有元组在新属性上的取值为空
Alter table r drop A;
(3)drop table r;
不仅删除r的所有元组,还删除r的模式。无法恢复。
DDL 与事务无关,create/alter/drop不受commit/rollback的影响
(4)索引的创建
Create (unique) index s1 on s(sno);
Drop index s1;
Select A1,A2,A3,…,An from r1,r2,…,rn where P
(1) select子句
由于每个元组的rowid不同,所以默认重复,除非使用distinct
Select distinct a1,a2 强行删除重复
Select all a1,a2 显示表明不去除重复
Select * 选择全部属性
允许±×/等算术表达式
(2)where子句
P为算术表达式
可以包含<,,>=,(比较运算符),and,not,or(逻辑连词),between(比较运算符)
Age (not) between 18 and 20
(3)from子句
相当于笛卡尔积,不是自然连接——natural join
Select name,course_id from instructor natural join teaches;
Join…using(属性) 由用户指明那些列相等
Select name,title from (instructor natural join teaches) join course using(course_id);
(1)更名运算
旧名 as 新名,属性和表均可以更名,as可以省略
表更名相当于声明了元组变量,没有更名的表可以看做是声明与表同名的元组变量。
(2)字符串操作
模式匹配操作like
Addr like ‘%济南%’
%:匹配任意子串
’intro%’匹配任何以intro打头的字符串,’%comp%’匹配任何包含comp的字符串
:匹配任意一个字符
‘__’匹配只含有三个字符的字符串
‘___%’匹配至少含三个字符的字符串
Upper(s)将字符串s转化为大写 lower(s)将字符串s转化为小写
Trim(s)去掉字符串后面的空格
\为转义字符,放在特殊字符前面使之成为普通字符
Like ‘ab%cd%’ 匹配以ab%cd开头的字符串
(3)排列元组的显示次序
Order by默认升序asc,desc为降序,多属性排序的处理:字典顺序。
只是显示次序排序,只能是sql的最后一个子句
(默认去重,使用all则强制按照多重集进行运算,保留重复)
·并运算 (select pid,sname from s) union (select pid,tname from t);
·交运算 intersect
·差运算 except
空值为关系运算带来了特殊的问题。在算术运算中,任意输入为空则算术表达式的结果为空。比较运算中将涉及空值的结果视为unknown。布尔运算中,and:true and unknown = unknown, false and unknown = false, unknown and unknown = unknown;or:true or unknown = true, false or unknown = unknown, unknown or unknown = unknown;not:not unknown = unknown;
利用is null 对空值进行判断。为空返回true,否则返回false
聚集函数中的null:聚集函数的输入集合中忽略null,当作用于空集合时,count(∅)=0,其他均返回null;
平均值avg() 最小值min() 最大值max() 总和sum() 计数count()
默认作用于多重集,强制作用于集合使用distinct
无分组使用聚集函数则返回一个关系(有且只有一行),select子句中出现聚集函数,不能同时出现非聚集的属性。
分组聚集:group by 子句
在group by子句中的所有属性上的取值相同的元组将被分在一个组中。
需要保证:任何没有出现在group by中的属性如果出现在select子句中,只能出现在聚集函数内部。
Having 子句中的谓词在形成分组后才起作用,对分组进行检查.
任何出现在having子句中但是没有被聚集的属性必须出现在group by中。
顺序:from -> where -> group by -> having -> select -> order by
(1)in:∈
1.枚举集合 where cno in (‘c1’,’c2’,’c3’)
2.子查询,tuple in (select …) 测试元组是否是集合中的成员
求哪些学生没有学哪些课?
Select sno,cno
From s,c
Where (sno,cno) not in
(select sno,cno from sc);
(2) exists:
判断子查询元组的存在性,子查询中select什么内容并不重要,只要返回为真
求学了c1的学生
① select * from s
where sno in
(select sno from sc where cno=‘c1’);
② select * from s where exists
(select * from sc
where sc.sno=s.sno and cno=‘c1’);
③ select s.* from s,sc
where s.sno=sc.sno and cno=‘c1’;
求没有学c1的学生
① select * from s
where sno not in
(select sno from sc where cno=‘c1’);
②select * from s
where not exists
(select * from sc
where sno=s.sno and cno=‘c1’);
(3) 全部概念的处理
1.超集superset:B是A的子集
– not exists (B except A)
求学了全部课程的学生
select sno from s
where not exists
((select cno from c)
except
(select cno from sc
where sc.sno=s.sno))
2.关系代数:÷
– not in(not in)
select sno from s
where sno not in//减去没有学全部课的
(select sno
from s,c
where (sno,cno) not in
(select sno,cno from sc))
3.关系演算: 任意
– not exists(not exists)
select sno from s
where not exists
(select * from c
where not exists
(select * from sc
where sc.sno=s.sno
and sc.cno=c.cno))
(4) 集合比较
Some( r ) 关系中的某一个元组
至少比某一个大 >some
=some等价于in
some不等价于not in
All® 关系中所有的元组
大于all 比所有的都大
all 等价于not in
=all 不等价于 in
(5) 重复元组unique
Unique判定是否有重复元组,不能判定是否只有一个元组,返回bool值
求各门课程成绩均不相同的学生
select * from s
where unique
(select score
from sc
where sc.sno=s.sno)
(6) with子句
提供定义临时关系的方法,这个定义只对包含with子句的查询有效
With max_budget(value) as
(select max(budget) from department)
Select budget
From department,max_budget
Where department.budget=max_budget.value;
(7) from子句中添加子查询
把查询的结果关系用在from子句中,
Select …
from (select …
from …
where …
group …
having …)
as r(A1,A2…)
where …
group by …
having …
(1)删除 delete from r where P
此处的from只能作用于一个关系,但是子句中的嵌套语句可以使用多个
(2)插入 insert into r values(v1,v2,v3);
(3)更新 update r set x=x where P;
Update r set (A1,A2,…)=(select …) where p;
连接类型:inner\left outer\right outer\full outer
连接条件:natural\using(使用同名属性)\θ连接(on)等价于where
任意组合
1.on条件
Select * from student join takes on student.ID=takes.ID
但是id属性会出现两次,利用投影所需属性来只显示一次
2.外连接——通过在结果中创建包含空值元组的形式,保留在连接中丢失的元组
·左外连接(left outer join) 只保留出现在左外连接运算之前的关系中的元组
·右外连接(right outer join)只保留出现在右外连接运算之后的关系中的元组
·全外连接(full outer join)保留出现在两个关系中的元组
Inner join为不保留未匹配元组的连接运算。
Create view vname(a1,a2,…) as
Select …
事务对DDL语句无作用,主要用于DML语句。
Commit work/rollback work
一个事务或者在完成所有步骤后提交其行为,或者在不能成功完成其所有动作的情况下回滚其所有动作,通过这种方式体现事务具有原子性。
1.DBMS保证数据库数据满足完整性约束,拒绝破坏完整性约束的数据修改要求
2.分类:实体完整性——主码非空、唯一,定义了主码系统自动保证
参照完整性——外码,系统自动保证参照完整性
用户自定义完整性——根据语义约束,用户自定义:not null,unique,check ,assertion
3.not null——非空约束,指定的属性上不允许出现空值
任何试图导致某非空属性为空的操作都将被拒绝
4.unique(A1,A2,…)——不允许有两个元组在指定的属性组上取值相同
Unique本身不限定属性非空
5.check P
关系上的每一个元组,都必须满足P,可以针对一个或多个属性。
6.foreign key外码约束
一个关系模式(r1)可能它的属性中包含另一个关系模式(r2)的主码,这个属性在r1上称作参照r2的外码。关系r1称为外码依赖的参照关系,r2叫做外码的被参照关系。
参照完整性约束:
1.权限的授予和收回
Select, update, delete, insert 针对关系或属性的权限。没有关于元组的权限
Grant
On
To (with grant option)令其拥有转授权
Revoke
On
To
转授权人的权利被收回时,其转授的权利随之被收回。
2. 角色
每个数据库用户被授予一组他有权扮演的角色。权限可以授予给角色,给人授予权限
Create/drop role rolename
Grant/revoke role to/from user ;
数据库系统的身份标识分为用户user和角色role
用户和角色的关系:
·连接使用数据库,必须以一个特定的用户身份
·不能使用role身份直接连接使用数据库
·一个用户可同时具备多个角色
·一个角色可以为多个用户拥有
·角色可以拥有角色
·角色拥有关系可以传递
·权限可以授予用户或者角色
·用户拥有授给本用户的所有权利,以及本用户具有的角色的所有权利
4.5 SQL的数据类型和模式
1.字符、数字、日期时间型
日期类型的运算
Cast ‘2001-01-31 10:29:30.52’ as timestamp//将字符串转化为时间类型
Extract (year from Vdatetime)//从date或time值中提取单独的域
Date1-date2= //两日期之间间隔的天数
2.用户自定义类型
独特类型:create type Dollars as numeric(12,2)
结构化数据类型:create type person(pid char(18),name varchar(8));
可以drop type和alter type
用户自定义域:create domain Dollars as numeric(12,2) not null;//可以声明完整性约束。
Type是强类型,domain不进行强类型检查,支持强制类型转换。
3.创建索引 create index xx on r(S);
4.大对象类型
字符类型的大对象数据类型clob,二进制数据的大对象数据类型blob。
存储实现方式为指针+文件
Select Bolb doc into 变量(将指针赋给变量)
From book
Where cno=’c1’;
数据库的doc中存的是指针
5.模式、目录和环境
一个DBMS可以管理多个catalog/instance/database
一个instance可以含多个schema
一个schema含多个关系table/view
访问数据库必须使用连接,catalog.schema.rname
每个用户可以拥有自己的schema前提是有权限。
基本表达式:一个关系或一个常数关系
如果E1,E2是关系代数表达式,则其有限次基本运算也为表达式。
1.广义投影
通过允许在投影列表中使用算数运算和字符串函数等来对投影进行扩展。
如salary/2
2.聚集
右下角注明聚集函数和属性
在前面声明分组属性 分组的属性也会被投影
右下角同时也可以进行更名
一个关系中只有一个元素的话,SQL可将之看做单值属性,但是关系运算则不可
形式化定义:
原子公式
·s∈R:s是关系R中的一个元组
·s[x] θ u[y]:S[x]与u[y]为元组分量,它们之间满足比较关系
·s[x]θ c:分量s[x]与常量c之间满足比较关系
公式的递归定义
·原子公式是公式
·如果P是公式,那么┑P和§也是公式
·如果P1 , P2是公式,则P1∧P2 , P1∨P2 , P1=>P2也是公式
·如果P(t)是包含自由元组变量t的公式,且r是关系,则存在t∈r (P(t))和任意t∈r (P(t)) 也是公式
{t | P(t) } 所有使P谓词为真的元组t的集合,t[A]表示元组t在属性A上的值。t∈r表示元组t在关系r中
T只定义在ID属性上,因为这一属性是对t进行限制的条件所涉及的唯一属性,结果得到id上的关系。
笛卡尔积的表示:两个存在作and
有可能会产生无线关系的表达式是不安全的,引入P的域dom ( P )表示:
·显式出现在P中的值,以及在P中出现的关系中分量值的集合
·公式的域是指的集合,不强调值“同类型”
如果出现在表达式{t | P(t) }结果中所有值均来自dom§则称该表达式是安全的。
找出所有选了生物系全部课程的学生
他是所有满足如下条件的学生(即ID上的元组t)的集合:对关系course中所有的元组u,如果u在dept_name属性上的值是“biology”那么在关系take中一定存在一个包含该学生ID以及该课程course_id的元组
数据库设计:概念模型设计、逻辑模型设计、物理模型设计
E-R图的位置:数据分析、描述的工具,用于概念模型设计
E-R图的作用:帮助澄清用户数据需求,分析员和用户对数据需求达成高度一致;数据逻辑模型设计的基础
E-R图的要求和评价标准:清晰、易懂,完整、精确、无二义
三要素:实体(矩形)、联系(菱形)、属性
实体(entity)是现实世界中可区别于所有其他对象的一个“事物”或“对象”。
实体集是相同类型即具有相同属性的一个实体集合。
实体集的外延指属于实体集的实体的实际集合。
联系(relationship)是指多个实体间的相互关联。
联系集是相同类型联系的集合。实体集参与联系集。实体在联系中所扮演的功能称为实体的角色。联系也可具有描述性属性。
属性——每个属性都有一个可取值的集合,称为域。
属性分类:简单和复合属性|单值和多值属性|派生属性
三约束:映射基数约束、参与约束、码约束
7.3.1 映射基数约束
·一对一:A中的一个实体至多与B中的一个实体相关联,且B也同理
·一对多:A中的一个实体可以与B中的任意数目(0/多)实体相关联,B中的一个实体至多与A中的一个实体相关联
·多对一:A中的一个实体至多与B中的一个实体相关联,B中的一个实体可以与A中任意数目个实体相关联
·多对多:A中的一个实体可以与B中的任意数目(0/多)实体相关联,B也同理
7.3.2 参与约束
如果实体集E中每个实体都参与到联系集R的至少一个联系中,实体集E在联系集R中的参与成为全部的。如果E中只有部分实体参与到R的联系中,实体集E 到联系集R的参与成为部分约束。
7.3.3 码约束
实体的属性的值必须可以唯一表示该实体
参与联系的实体集的主码的组合作为联系集的超码。如果联系为多对一,则多段主码为该联系集主码。多对多则实体集主码共同作为联系集主码
·分成两部分的矩形代表实体集。第一部分包含实体集的名字,第二部分包含实体集中属性名,主码加下划线。
·菱形代表联系集。
·未分割的矩形代表联系集的属性
·虚线将联系集属性连接到联系集。
·双线显示实体在联系集中的参与度
·双菱形代表连接到弱实体集的标志性联系集,同时弱实体集也要双矩形
映射基数:一端为箭头
完全参与:双横线
弱实体集——没有足够的属性以形成主码的实体集称为弱实体集,视为多值复合属性,但希望与其他实体、属性发生关系所以将其弱实体化。弱实体集存在依赖于标识实体集,之间的联系称为标识性联系,从弱实体集到标识实体集是多对一的,且弱实体集在联系中的参与是全部的。
使用弱实体集的原因:
·避免数据冗余,强实体集码重复,以及因此带来的数据的不一致性
·弱实体集反映了一个实体对其他实体依赖的逻辑结构
·弱实体集可以随它们的强实体集的删除而自动删除
·弱实体集可以物理地随它们的强实体集存储
弱实体集所对应的关系的码由弱实体集本身的分辨符再加上所依赖的强实体集的码,建外码约束
联系集向关系模式的转换:联系集的描述性属性加上参与R的实体集的主码。
=模式的合并
联系集和完全参与的一端进行合并,避免空值的产生
如果都不为完全参与,那么和参与的多的进行合并
·1NF:如果关系模式R的所有属性的域都是原子的。
·原子域:该域的元素被认为是不可分的单元。
用基于码和函数依赖的规范方法判断一个关系模式是否应该分解。
·超码:令r( R )是一个关系模式。R的子集K是r( R )超码的条件:在r( R )的任意合法实例中,对于r的实例中的所有元组t1和t2总满足,若t1 ≠ t2,则t1[K] ≠ t2[K]。(全部与部分)
·函数依赖:表达唯一标识某些属性的值的约束
给定r( R )的一个实例,满足函数依赖α→β的条件:
·对实例中的所有元组对t1 和t2,若t1[α] = t2 [α] ,则t1[β] = t2[β]。(部分与部分)
·如果r®的每个合法实例都满足函数依赖α→β,则该函数依赖在模式r( R )上成立(hold)
如果函数依赖K->R在r( R )上成立,则K是r( R )的一个超码。
R下的所有函数依赖组成R的函数依赖集,记为F。F+标识F 集合的闭包,能够从给定F集合推导出的所有函数依赖的集合。
平凡函数依赖:A->A;Y⊆X,则 X→Y
BCNF
对F+中所有形如α→β的函数依赖,下面至少有一项成立:
·α→β是平凡的
·α是模式R的一个超码
分解非BCNF模式的一般规则:
存在至少一个非平凡的函数依赖α→β,其中α不是R的超码。在设计中用以下两个模式取代R:(α∪β) (使α变超码)和(R - (β -α ))(α、β无交集则β-α=β)
到BCNF的分解会妨碍对某些函数依赖的高效检查。BCNF不保持依赖
3NF
约束放宽,允许左侧不是超码的某些非平凡函数依赖。3NF保持依赖
具有函数依赖集F的关系模式R,对F+中所有型如α→β的函数依赖(其中α R且β R),下面至少有一项成立:
·α→β 是平凡的函数依赖(即β 含于 α)
·α是模式R的一个超码。
·β-α中的每个属性A都包含于R的一个候选码中。(属性A可以包含于不同的候选码中)
函数依赖集的闭包
F的闭包是被F逻辑蕴含的所有函数依赖的集合,记作F+
反复使用Armstrong公理即可得到F+
F+算法
函数依赖集的等价
定义 设R=(U)的两个函数依赖集F和G,如果F+=G+,则称F和G是等价的,如果F和G是等价的,则称F覆盖G且G覆盖F。
F和G是否等价的方法:
检查F中的每个函数依赖X→Y,检查Y是否属于X+G。
检查G中的每个函数依赖X→Y,检查Y是否属于X+F。
属性集的闭包
令α为一个属性集。我们将函数依赖集F下被α函数确定的所有属性的集合称为F下α的闭包,即为α+。
把判断X→Y是否属于F+,转化为判断Y是否属于X+F 。
属性集闭包的用途:
候选码的求法
·一个属性集函数确定U,若它的任一个子集都不能函数确定U,则属性集可作为候选码。
·候选码从箭头左边的属性中找。仅在箭头左边的属性一定在候选码中。
正则覆盖
无关属性的定义:去除函数依赖中的一个属性不改变该函数依赖集的闭包称该属性为无关属性。即F+=F’+
左无关属性的判定:
令γ=α-{A},检查γ →β是否可由F推出,即γF+是否包含β
右无关属性的判定:
检验α→A是否能由F’推出,即==(α)F’+是否包含A==
正则覆盖
定义:关系模式R(F),F的正则覆盖记为Fc, F逻辑蕴含Fc中的所有依赖,且Fc逻辑蕴含F中的所有依赖。此外,Fc必须具有下列性质:
·Fc不含无关属性
·Fc函数依赖左端都是唯一的
Step1:左端相同的函数依赖合并;
Step2:逐个属性判断是否为无关属性;
Step3:发现无关属性,去掉该属性,并重新进行step2;直到没有无关属性;
无损分解
无损分解定理
关系模式R( C ), {R1,R2}是R( C )的分解,当下面两个函数依赖至少有一个在R( C )上成立时,分解是无损分解:
R1∩R2→R1
R1∩R2→R2
自然连接后可能会多出许多元组,则为有损分解。
保持依赖
R的分解中,不依靠不同关系的连接就能验证R上成立的所有函数依赖,称分解保持依赖。
关系模式R(F), {R1,R2…Rn}是R的一个分解;F+中所有只包含Ri中属性的函数依赖的集合Fi,称为F在Ri上的限定。Fi必须是F+中只含Ri属性的函数依赖集合。
关系模式R(F),{R1,R2…Rn}是R的一个分解,Fi是F在Ri上的限定,F’= F1∪F2∪…∪Fn:如果F’+=F+, 即F’F,则称分解是保持依赖的分解
算法一:分别计算F’+和F+,若F’+=F+则保持依赖
算法二:验证每一个f∈F,是否在某一个RI上成立
如果都成立:保持依赖 (充分条件);如果不都成立:不知道是否保持依赖
算法三: 如果result包含β中所有属性,则 α→β∈F被保持;该分解保持依赖当且仅当F中所有的函数依赖都保持。
BCNF的判定
计算α→β中α的闭包,是否包含R中所有属性
3NF判定
按照3NF定义逐个检查F中是否有违背3NF要求的函数依赖
分解算法
·Step1:计算Fc
·Step2:对每一α→βFc ,构造关系(αβ)
·Step3:如果step2构造的所有模式都不含R的码,选择R的一个候选码α,构造关系(α)
step2-3构造出的所有模式集合是R的3NF分解
得到无损的保持依赖的分解
多值依赖定义:关系模式r( R ), α属于 R且β 属于 R ,γ=R-α-β;
如果对任意r属于R均有下述命题成立:
任意 t1,t2属于 r,如果t1[α]=t2[α],则必存在t3,t4,使
t3[α]=t4 [α]= t1 [α] =t2[α],
t3[β]=t1[β],t3[γ]=t2[γ]
t4[β]=t2[β],t4[γ]=t1[γ]
则称: α多值决定β,
β多值依赖于α
多值依赖α→→β在R上成立
或者定义为:关系模式R, α,β R,γ=R-α-β;如果给定一个α值,有一组β值与之对应,β取值与γ无关,则称α→→β。
平凡的多值依赖:β∪α=R,或者β属于α,必有α→→β
若α→β ,则α→→β,每一个函数依赖也是一个多值依赖。
若α→→β, 则α→→R – α –β
依赖的闭包:D逻辑蕴含的所有函数依赖和多值依赖的集合,称作D的闭包,记作D+
4NF
对D+中所有型如α→→β的多值依赖(α R且βR) ,至少一下之一成立:
1) α→→β是一个平凡的多值依赖,即:βα或 α∪β=R
2) α是R的一个超码
则称关系模式R为4NF,记作R∈4NF
1.构成单一逻辑工作单元的操作集合称作事务。
2.事务是访问并可能更新各种数据项的一个程序执行单元。
3.四大特性ACID
·原子性(atomicity)事务的所有操作在数据库中要么全部正确反映出来,要么完全不反映。
·一致性(consistency)隔离执行事务即没有其他事务并发执行的情况下,保持数据库的一致性。
·隔离性(isolation)尽管多个事务可能并发执行,但是每个事务都感觉不到系统中有其他事务在并发的执行。
·持久性(durability)一个事务成功完成后,他对数据库的改变必须是永久的,即使出现系统故障。
4.并发性:同时处理多个任务,但某一时刻只做一个,处理统一数据并发会有冲突,但是并发不会堵塞,提升总体吞吐量
并行性:每个时刻都是多个任务一起执行。
5.事务运用read(X)和write(X)访问数据
事务必须处于一下状态之一:
·活动的(active):初始状态,事务执行时处于这个状态
·部分提交的:最后一条语句执行后
·失败的:发现正常的执行不能继续后
·中止的:事务回滚并且数据库已恢复到事务开始执行前的状态后
·提交的:成功完成后
1.并发的优点:提高吞吐量和资源利用率;减少等待时间
2.事务的执行顺序称为调度,表示指令在系统中执行的时间顺序。一组事务的一个调度必须包含这一组事务的全部指令,并且必须保持指令在各个事务中出现的顺序。
3.串行调度一定为对的。
4.等价于某一串行调度的并发执行才是正确的
并发执行等价于串行调度为可串行化。
如果调度S可以经过一系列非冲突指令交换转换成S’,我们称S’与S是冲突等价的。调度S是冲突可串行化的。 当I和J是不同事务在相同数据项上的操作,并且其中至少有一个是write指令时,我们说I和J是冲突的。 设I与J是调度S的两条连续指令。若I与J是属于不同事务的指令且不冲突,则可以交换I与J的顺序得到一个新的调度S’,S与S’等价。 优先图:Ti,Tj冲突,若Ti先访问,则Ti优先于Tj,在图中加一条边。为保证原子性,必须在修改数据库之前,先向稳定存储器输出信息,描述要做的修改。
·日志是日志记录的序列,他记录数据库中的所有更新活动。
更新日志记录描述一次数据库写操作。表明事务Ti对数据项Xj执行了一个写操作,v1为原数据,v2为新数据。写操作必须先添加日志记录,再操作数据库。
事务Ti开始
事务Ti提交
事务Ti终止。
数据库修改指:事务执行了对磁盘缓冲区和磁盘的更新。
使用日志执行适当的undo和redo操作。Undo:将数据项设置为旧值,Redo将数据项设置为新值。
事务提交:
当一个事务的commit日志记录—这是该事务的最后一个日志记录—输出到稳定存储器后,我们就说这个事务提交了。但是不是在事务提交时必须将包含该事务修改数据项的快输出到稳定存储器中,可以在以后的某个时间再输出。同时未提交数据也可能被output至存储器,写入前必须先将日志缓冲区所有日志先写到磁盘上。
系统从尾端开始反向扫描日志来执行undo。
对于事务Ti的undo操作完成后,它写一个日志记录,表示撤销完成了
对于每个事务,undo只执行一次。
如果日志包括记录,但既不包括也不包括则对事务Ti进行撤销。如果既包含,以及或,则需要对Ti进行重做。
检查点
检查点的执行过程
a) 将当前位于主存的所有日志记录输出到稳定存储器
b) 将所有修改的缓冲块输出到磁盘
c) 将一个日志记录输出到稳定存储器,L是执行检查点时正活跃的事务列表。
检查点执行过程中不允许事务执行任何更新动作。
加入检查点记录提高系统恢复效率,崩溃后在日志中找到最后一条检查点记录,只需对L中的事务在检查点之后的记录进行undo或redo。
12.14 请解释为什么undo-list中事务的日志必须由后往前进行处理,而redo-list中事务的日志记录则必须由前往后进行处理。
在undo-list中的单个事务中,假设一个数据项被多次更新,比如从1更新到2,然后从2更新到3。如果按正向顺序处理撤消日志记录,则数据项的最终值将被错误地设置为2,而按反向顺序处理,则将该值设置为1。同样的逻辑也适用于撤消列表中由多个事务更新的数据项。使用与上面相同的示例,但是假设事务已提交,很容易看出,如果重做处理按正向顺序处理记录,则最终值将正确地设置为3,但如果按反向顺序处理,则最终值将错误地设置为2。
12.15 请解释检查点机制的目的。应该间隔多长时间做一次检查点?执行检查点的频率对一下各项有何影响?
·无故障发生时的系统性能如何?
·从系统崩溃中恢复所需的时间多长?
·从介质(磁盘)故障中恢复所需的时间多长?
检查点使用基于日志的恢复方案来完成,以减少崩溃后恢复所需的时间。如果没有检查点,则在崩溃后必须搜索整个日志,并且所有事务都要从日志中撤消/重做。如果已经执行了检查点,那么在恢复时可以忽略检查点之前的大多数日志记录。执行检查点的另一个原因是在稳定存储空间满时清除日志记录。
由于检查点在执行过程中会导致性能损失,所以如果快速恢复不是很重要,那么应该减少检查点的使用频率。如果我们需要快速恢复,检查点频率应该增加。如果可用的稳定存储数量较少,则频繁检查点不可避免的。
检查点对磁盘崩溃的恢复没有影响;归档转储相当于从磁盘崩溃中恢复的检查点。
12.16 列出ACID特性,解释每一特性的用途。
12.17 事务从开始执行直到提交或终止,期间要经过几个状态。列出所有可能出现的事务状态序列,解释每一种状态变迁出现的原因。
可能的状态序列为:
答:活跃→部分提交→提交。这是一个成功的事务将遵循的正常顺序。执行完所有语句后,它进入部分提交状态。将足够的恢复信息写入磁盘后,事务最终进入提交状态。
b.活动→部分提交→中止。在执行事务的最后一条语句后,它进入部分提交状态。但在将足够的恢复信息写入磁盘之前,可能会发生硬件故障,破坏内存内容。在这种情况下,它对数据库所做的更改被撤消,事务进入中止状态。
c.活动→失败→中止。事务启动后,如果在某个点发现正常执行无法继续(由于内部程序错误或外部错误),则进入失败状态。然后回滚,然后进入中止状态。
12.18 解释串行调度和可串行调度的区别
属于一个事务的所有指令一起出现的调度成为串行调度。
一个可串行调度等价于某个串行调度即可,调度等价有两种定义:冲突等价和视图等价。
SQL语句联系