计科210X 甘晴void 202108010XXX
教材:《数据库系统概论》第6版
(图片来源于网络,侵删)
基本概念:
数据:描述事物的符号记录称为数据。数据的含义称为数据的语义,数据与其语义是不可分的。
数据库(DB):长期存储在计算机内、有组织的、可共享的大量数据的集合。数据库中的数据按一定的数据模型组织、描述和存储,具有较小的冗余度、较高的数据独立性和易扩展性,并可为各种用户共享。
数据库管理系统(DBMS):数据库管理软件,计算机的基础软件
数据定义功能
数据组织、存储和管理
数据操纵功能
数据库的事务管理和运行管理
数据库的建立和维护功能
其他功能
数据库系统(DBS):由DB,DBMS及其应用开发工具,应用系统和DBA组成的存储、管理、处理和维护数据的系统
DBA数据库管理员
数据库管理技术的产生和发展:
人工管理阶段 -> 文件系统阶段 -> 数据库系统阶段
数据库系统阶段的4个优点
另外还需要提供的功能:
数据模型:数据库系统的核心和基础。
数据建模:把现实世界中的具体事物抽象、组织为某一数据库管理系统支持的数据模型。
概念模型(现实世界抽象为信息世界) -> 数据模型(信息世界转换为机器世界)
概念模型:
概念模型的表示方法:实体-联系模型(E-R模型)
数据模型三要素:
层次模型:
网状模型:
关系模型:
人员包括
4个基本概念
数据模型3要素
三级模式与两级映射保证逻辑独立性与物理独立性
数据库系统三级模式结构的优点
为什么具有数据和结构的独立性
域:域
笛卡尔积:笛卡尔积(域的运算)、元组、n元组、分量(元组中的每一个值)、基数 (一个域允许的不同取值个数)
关系:
关系(一些域的笛卡尔积的子集即为这些域的关系,抽取有意义的子集),记作R(……)、
关系的目/度n(运算的笛卡尔积的个数,即关系表的特征列个数)、
属性(n目关系必有n个属性)、
三类关系
基本关系(基本表/基表)【实际存在】有6条性质(列同质、不同元组码不能相同、不同列可出自同一域、列可换顺序、行可换顺序、分量取原子值,即不能表中有表)
查询表【针对查询结果的临时表,实际存在】
视图表【虚表】
R(A1,A2,A3,)
关系数据库:关系数据库模式:关系数据库的“型”
关系模型的存储结构:RDBMS
关系完备性:一个关系数据语言能够表示关系代数可以表示的查询
包括
并、差、交、笛卡尔积
常考:R∩S=R-(R-S)
基础记号:
专门关系:
经过有限次复合得到的表达式称为 关系代数表达式
如何使用五种基本运算来表达专门关系?是一个重要的问题
▲特点
模式的定义与删除
#定义模式
create schema [模式名] authorization <用户名>;
#删除模式
drop schema <模式名><cascade|restrict> //级联与限制必须二选一(CASADE会删除所有,而若该模式内有东西,RESTRICT会拒绝删除)
基本表的定义、删除与修改
#基本表的定义
create table <表名>(<列名><数据类型>[列级完整性约束]
……
[,<表级完整性约束>]);
#一些表级完整性约束
PRIMARY KEY(Sno,Cno);
FOREIGN KEY(Sno) REFERENCES Student(Sno);
列级完整性/表级完整性
#基本表的修改
ALTER TABLE <表名>
[ADD [COLUMN] <新列名><数据类型>[完整性约束]]
[ADD <表级完整性约束>]
[DROP [column] <列名> [cascade|restrict]]
[DROP constraint <完整性约束名> [restrict|cascade]]
[RENAME COLUMN <列名> to <新列名>]
[ALTER COLUMN <列名> TYPE <数据类型>]
#基本表的删除
DROP TABLE <表名> [restrict|cascade] #▲注意区别,默认RESTRICT
模式与基本表
#基本表属于某一个特定的模式,下面是创建特定模式下基本表的方法。
#可以在指定模式下创建基本表
CREATE TABLE "SC-C-SC".Student(……)
#可以设定模式然后创建基本表
SHOW SEARCH_PATH;#可以查看当前搜索路径
SET SEARCH_PATH TO "SC-C-SC",PUBLIC;#设置当前模式
#之后再创建基本表
课本示例
#课本示例
/*建立一个学生表*/
CREATE TABLE Student(
Sno CHAR(9)PRIMARY KEY,
Sname CHAR(20)UNIQUE,
Ssex CHAR(2),
Sage SMALLINT,
Sdept CHAR(20)
);
/*建立一个课程表*/
CREATE TABLE Course(
Cno CHAR(4) PRIMARY KEY,
Cname CHAR(40) NOT NULL,
Cpno CHAR(4),
Ccredit SMALLINT,
/*表级完整性约束条件*/
FOREIGN KEY (Cpno) REFERENCES Course(Cno)
);
/*建立学生选课表SC*/
CREATE TABLE SC(
Sno CHAR(9),
Cno CHAR(4),
Grade SMALLINT,
PRIMARY KEY(Sno,Cno),
FOREIGN KEY(Sno) REFERENCES Student(Sno),
FOREIGN KEY(Cno) REFERENCES Cource(Cno)
);
数据类型
P75
索引的建立与删除
建立索引:加快查询速度
索引是关系数据库管理系统的内部实现技术,属于内模式的范畴。
#索引的建立
CREATE [unique][cluster]index <索引名>
on <表名>(<列名>[<次序>],……)
#索引的修改
ALTER index <旧索引名> rename to <新索引名>
#索引的删除
DROP index <索引名>
#e.g.
CREATE UNIQUE INDEX Stusno ON Student(Sno);
CREATE UNIQUE INDEX Cousno ON Cource(Cno);
CREATE UNIQUE INDEX SCno ON SC(Sno ASC,Cno DESC);
数据字典(记录数据定义)
SELECT [all|distinct]<目标列表达式>[别名][,<目标列表达式>[别名]]……
FROM <>
[WHERE<条件表达式>]
[GROUP BY <某个列名> [having <条件表达式>]]
[ORDER BY <某个列名> [asc|desc]]
[limit <行数1>[offset <行数2>]]
3.3.1单表查询
#选择表中的若干列(投影操作)
SELECT Sno FROM Student;
#选择表中的若干组(选择操作)
SELECT DISTINCT Sno FROM Student;
#比较大小
WHERE = > < <> != !> !<
#确定范围
SELECT Sno FROM Student WHERE Sage BETWEEN 20 AND 21;
SELECT Sno FROM Student WHERE Sage NOT BETWEEN 20 AND 21;
#确定集合
IN | NOT IN
#字符匹配
% #任意长度字符串
_ #任意单个字符
WHERE Sname LIKE '__寅';
WHERE Sname NOT LIKE '%寅';
#涉及到含有通配符,可以后跟ESCAPE'\'进行转义
#WHERE Sname NOT LIKE '%寅\_' ESCAPE '\';
#涉及空值的查询
WHERE GRADE IS NULL
WHERE GRADE IS NOT NULL
#多重条件查询
AND OR 括号
#ORDER BY子句
ORDER BY grade DESC | ASC #(排序操作)允许第二关键字
#查询结果排序,不影响原表
#聚集函数(数理统计)
#不能用作WHERE子句条件表达式
#只能作为SELECT子句和GROUP BY子句的HAVING短语
COUNT(*)
COUNT([ DISTINCT | ALL ]<列名>)
支持 sum avg max min
#e.g.
SELECT COUNT(DISTINCT Sno) From SC;
#GROUP BY子句(分组筛选)★★★
GROUP BY
SELECT Sno FROM SC GROUP BY Sno HAVING COUNT(*) > 10;
#Limit子句(只选择前多少个子句,常与ORDER BY连用)
LIMIT 10 OFFSET 5 #显示10个忽略前5个
3.3.2连接查询
# 自然连接查询 复合条件连接查询
SELECT student.sno,sname
FROM student,sc
WHERE student.sno=sc.sno AND
sc.cno='2' AND sc.grade>90;
# 自身连接,需要为表起别名
#e.g. 间接先修课(先修课的先修课)
SELECT first.cno,seconde.cpno
FROM course first,course second
WHERE first.cpno=second.cno;
# 外连接,把表中的悬浮元组保存在结果关系中
SELECT student.sno,sname,ssex,sage,sdept,cno,grade
FROM student LEFT OUTER JOIN sc ON (student.sno=sc.sno);
# 多表连接和以上类似
3.3.3嵌套查询
查询块:一个select-from-where
嵌套查询,外层查询(父查询),内层查询(子查询)
【子查询不能用order by】
any,all,
exist谓词:只返回逻辑真假
存在量词与全称量词
# 不相关子查询
SELECT name
FROM student
WHERE dept IN
(
SELECT dept
FROM student
WHERE name='刘晨'
);
# 相关子查询
SELECT sno,cno
FROM SC x
WHERE Grade >= (
SELECT AVG(Grade)
FROM SC y
WHERE y.sno=x.sno
);
# ANY(SOME)/ALL
SELECT name,age
FROM student
WHERE age<ALL
(
SELECT age
FROM student
WHERE dept='CS'
)
AND dept!='CS';
# EXIST
SELECT name
FROM student
WHERE EXISTS
(
SELECT *
FROM SC
WHERE sno=student.sno AND cno='1'
);
★全称量词的转换
看书
★逻辑蕴含的转换
看书和作业例题
3.3.4集合查询(了解即可)
# UNION
SELECT *
FROM student
WHERE dept='CS'
UNION (UNION ALL)
SELECT *
FROM student
WHERE age<=19;
# INTERSECT
SELECT *
FROM student
WHERE dept='CS'
INTERSECT
SELECT *
FROM student
WHERE age<=19;
# EXCEPT
SELECT *
FROM student
WHERE dept='CS'
EXCEPT
SELECT *
FROM student
WHERE age<=19;
3.3.5基于派生表的查询
SELECT Sno,Cno
FROM SC,(SELECT Sno,Avg(Grade) FROM SC GROUP BY Sno)
AS Avg_SC(Avg_sno,Avg_grade)
WHERE SC.Sno = Avg_SC.Avg_sno AND SC.Grade >= Avg_SC.Avg_grade;
3.4.1插入数据
插入一个元组
INSERT INTO <表名> [(<属性列1>,<属性列2>,……)] #如果与原表一致则可以省略
VALUES (<常量1>,<常量2>,……);
插入子查询结果
insert into <表名> [(<属性列1>,<属性列2>,……)]
子查询;
#e.g.
# 插入元组
INSERT INTO student(sno,sname,ssex,sdept,sage) #可以不指出属性名,但VALUE要保持顺序
VALUES('201215128','陈东','男','IS',18); #未给出的列将自动赋空值
# 插入子查询结果
CREATE TABLE DEPT_AGE
(SDEPT CHAR(15)
AVG_AGE SMALLINT);
INSERT DEPT_AGE(SDEPT,AVG_AGE)
SELECT SDEPT,AVG(SAGE)
FROM STUDENT
GROUP BY SDEPT;
3.4.2修改数据
update <表名>
set <列名>=<表达式>,<列名>=<表达式>……
[where <条件>];
# 修改一个元组的值
UPDATE student
SET sage=22
WHERE sno='201215121';
# 修改多个元组的值
UPDATE student
SET sage=sage+1;
# 带子查询的修改语句
UPDATE SC
SET grade=0
WHERE sno IN
(SELECT sno
FROM student
WHERE sdept='CS');
3.4.3删除数据
delete from <表名>
[where <条件>];
空值与另一个值的算数运算结果为空值
空值与另一个值的比较运算结果为UNKNOWN,不参与/影响是非判定
CREATE VIEW <视图名>[(<列名1>,<列名2>,……)]
as <子查询> #子查询可以嵌套,此时称建立在多个基本表上
[with check option]; #加上该句之后插入值时会自动检查是否符合子查询的要求,若不满足则拒绝
DROP VIEW <视图名> [CASCADE]
UPDATE SET WHERE
INSERT INTO VALUES
DELETE FROM WHERE
★视图的作用:
数据库安全性是指保护数据库,以防不合法使用所造成的数巨泄露、篡改或破坏。
★数据库的安全性保护数据防止恶意的破坏和非法的存取
不安全因素:
安全标准:TCSEC:A1,B3,B2,B1,C2,C1,D
CC
用户身份鉴别:静态口令鉴别,动态口令鉴别,生物特征鉴别,智能卡鉴别,入侵检测
存取控制:自主存取控制DAC(C2级),强制存取控制MAC(B1级)
自主存取控制的缺点是可能存在数据无意识的泄露。因为数据本身并无安全性标记。
授权(grant)
GRANT <权限1>,<权限2>…… #全部,用all priviliges
ON <对象类型><对象名>,<对象类型2><对象名2>……
TO <用户1>,<用户2>…… #全部,用public
[with grant option] #是否允许授权传播
#注意不得循环授权
收回(revoke)
revoke <权限1>,<权限2>……
on <对象类型><对象名>,<对象类型2><对象名2>……
from <用户1>,<用户2>……[cascade | restrict]
创建数据库权限
create user <username> [with] [superuser | createdb] | password 'password';
数据库角色
create role <角色名> #创建角色
grant <权限> on <对象类型><对象名> to <角色> #角色授权
grant <角色> to <角色/用户> [with admin option] #角色授予其他角色/用户,with admin option是否允许传播
revoke <权限> on <对象类型><对象名> from <角色> #角色授权收回
强制存取控制是对数据本身进行密级标记,无论数据如何复制,标记与数据是一个不可分的整体。
同时检查DAC和MAC
每个数据库对象被标以一定的密级,每一个用户被授予某一个级别的许可证。对于任意一个对象,只有具有合法许可证的用户才可以存取。主体对客体的存取必须遵循以下规则:
第二条是为了防止高许可证级别的主体恶意降低高密级客体导致数据泄露。
与授权机制结合
审计功能把用户对数据库的所有操作记录下来放入审计日志。
审计员可以通过审计日志监控数据库行为,找到非法存取数据的人,时间和内容等。审计机制提供了一种事后安全检查的机制。
DDL,DML,DCL分别是什么
show audit_trail
set audit_trail to on
audit alert,update on xxx by access #对xxx进行审计
noaudit alert,update on xxx #取消对xxx进行审计
存储加密,传输加密
推理控制,隐蔽信道,数据隐私,“三权分立”的安全管理机制
★数据库的完整性防范对象:不合语义、不正确的数据,防止它们进入数据库。
数据库数据的正确性和相容性
据库管理系统必须能够实现以下功能:
PRIMARY KEY 主码
检查主码值是否唯一,检查主码的各个属性是否为空,否则拒绝修改
FOREIGN KEY 外码
对被参照表和参照表进行修改时可能出现问题
违约处理策略:(一般采用默认,如果需要其他,则在创建参照表时显式说明)
属性上的约束(不满足拒绝执行)
元组上的约束
违约处理:拒绝执行
注意如何使用CHECK子句
完整性约束命名子句
CONSTRAINT <完整性约束名> <完整性约束>
包括NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK等子句
修改表中的完整性限制
ALTER TABLE xxxxx
DROP CONSTRAINT C1
ADD CONSTRAINT C2 NOT NULL
事件-条件-动作规则(ECArule)
类似约束,自动激活,功能更强
定义触发器
CREATE TRIGGER <触发器名>
{BEFORE|AFTER} <触发事件> ON <表名> #触发事件为INSERT,DELETE,UPDATE以及它们的and,or以及类似UPDATE <触发列,……>具体指明操作列
REFERENCING NEW|OLD AS <变量>
FOR EACH {ROW|STATEMENT}
[WHEN<触发条件>]
<触发动作体>
教材举例:
# 将INSERT语句增加的元组数记录到insertlog中
CREATE TRIGGER Student_Count
AFTER INSERT ON Student
REFERENCING
NEW TABLE AS DELTA
FOR EACH STATEMENT
INSERT INTO StudentInsertLog(Numbers)
SELECT COUNT(*) FROM DELTA;
# 将分数增加10%的操作添加到一个另一个表SC_U
CREATE TRIGGER SC_T
AFTER UPDATE ON SC
REFERENCING
OLDROW AS OldTuple
NEWROW AS NewTuple
FOR EACH ROW
WHEN (NewTuple.Grade>=1.1*OldTuple.Grade)
INSERT INTO SC_U (Sno,Cno,OldGrade,NewGrade)
VALUES(OldTuple.Sno,OldTuple.Cno,ldTuple.Grade,NewTuple.Grade);
# 教授的工资不低于4000,低于4000则改为4000
CREATE TRIGGER Insert_Or_Update_Sal
BEFORE INSERT OR UPDATE ON Teacher
REFERENCING NEW row AS newtuple
FOR EACH ROW
BEGIN
IF(newtuple.Job=‘教授’) AND newtuple.Sal<4000)
THEN newtuple.Sal:=4000;
END IF;
END;
执行触发器(顺序)
删除触发器
DROP TRIGGER <触发器名> ON <表名>
事务的四个特性:持久性,一致性,原子性,隔离性
SQL语言具有的功能:数据定义,数据操纵,数据控制
DML数据操纵语言,DBL数据定义语言
函数依赖:
X函数确定Y 或 Y函数依赖于X 记作 X→Y
非平凡的函数依赖/平凡的函数依赖(X→Y但Y?X,则是平凡的)
完全函数依赖/部分函数依赖(X推出Y时X中的各部分是否缺一不可,若X的一部分就可以推出Y,则是部分函数依赖)
直接函数依赖/传递函数依赖(X→Y,Y不是平凡的,Y不能→X,Y→Z,Z不是平凡的,则X→Z有传递函数依赖)
(★不考)多值依赖:
码/键:
范式
★不同等级的范式
1NF(属性值都是不可分的原子值)
2NF(每一个非主属性完全函数依赖于任何一个候选码)
3NF(在1NF基础上,R不存在码X属性组Y非主属性Z且Z不是Y的子集,X→Y,Y→Z,Y不能→X)【每一个非主属性不传递依赖于码,不部分依赖于码】
BCNF(在1NF基础上,X→Y且Y不是X子集,X必含有码,即每一个决定因素必含有码)【不存在任何属性对候选码的传递函数依赖】在3NF基础上消除了主属性对码的部分函数依赖
(不考)4NF(在1NF基础上,对于R的每个非平凡多值依赖X→→Y且Y不是X的子集,X都含有码)
(应试)掌握到3NF与BCNF即可,考题问是否能达到3NF
Armstrong公理系统
根据A1,A2,A3可得以下推理规则
引理:X→A1A2A3A4……Ak <<<充分必要>>> X→Ai成立(1<i<n)
Armstrong公理系统的有效性&完备性
函数依赖集的闭包:
函数依赖集的等价
★★★大题考察:
【书P187-189】
数据库一般设计过程
数据字典,包括下列5项
数据项:不可再分的数据单位
数据结构:反映数据项之间的组合关系。数据结构可由数据项/数据结构混合组成。
数据流:数据结构在系统内传输的路径
数据存储:数据结构停留或保存的地方,也是数据流的来源和去向之一。
处理过程:判定表/判定树
概念模型:①真实充分反映现实世界,②易于理解,③易于更改,④易于向关系模型,网状模型,层次模型等数据模型进行转换。
E-R模型:
实体之间的联系:
E-R图:
【考试:先画含属性的实体型图,再画一张不含属性但含联系的实体型图】
用E-R图进行概念结构设计:
E-R图集成:
过程:
(1)合并E-R图,生成初步E-R图
(2)消除不必要的冗余,设计基本E-R图
分析法:【……不是考察重点,不再展开……】
规范化理论:【……不是考察重点,不再展开……】
E-R图向关系模型的转换
数据模型的优化
以规范化理论为指导:【5条】
水平分解:把(基本)关系的元组分为若干子集合
垂直分解:把关系模式R的属性分解为若干子集合
数据库物理结构设计的内容和方法
选择关系模式存取方法
(1)B+树索引方法的选择
维护索引要代价,索引不是越多越好
(2)哈希索引方法的选择
①大小可预知且不变,或②关系大小动态改变,但DBMS支持动态哈希索引方法
(3)聚簇方法的选择
提高某个属性(组)的查询速度,把这个或这些属性上具有相同值的元组集中存放在连续的物理块。该属性(组)称聚簇码。
设计候选聚簇【3条,略】
检查候选聚簇中的关系,取消不必要的关系【3条,略】
确定数据库的存储结构
评价数据库的物理结构:存储空间,存取时间,维护代价等
重组和重构
数据的载入和应用程序的编码与调试
数据库的试运行
数据库的运行和维护
with子句
WITH RECURSIVE 子句
内置函数
通过高级语言实现复杂应用
过程化SQL的基本结构
变量/常量定义
流程控制:条件控制/循环控制/错误处理
存储过程:创建/执行/修改/删除/优点
# 优点
运行效率更高,降低了客户机和服务器间的通信量,方便实施企业规则
存储函数(必须指定返回类型):创建/执行/修改
CREATE OR REPLACE FUNCTION 函数名
RETURNS <类型>
AS <过程化SQL块>
Java DataBase Connectivity
结构:用户应用程序,JDBC驱动程序管理器,数据源
使用JDBC操纵数据库的工作流程
【书P263有完整案例】
了解 B+树索引,哈希索引
查询处理步骤:
实现查询操作的算法:
选择操作:
连接操作:
查询优化:选择有效的策略,求得给定关系表达式的值,使得查询代价较小。
★一个实例P308【可考计算题】
通过对关系代数表达式的等价变换来提高查询效率
关系代数表达式等价变换规则【书P309-310】
语法树的启发式优化【5条启发式规则】
★大题:画语法树,关系代数语法树,优化后的语法树
可供选择的方法有
基于启发式规则的优化:
选择操作的启发式规则:
连接操作的启发式规则:
基于代价估算的优化
【书P314】
1.试述关系数据库管理系统查询优化的一般准则。
记忆:选择怎么样?投影怎么样?选择和投影可以怎么样?选择和笛卡尔积可以怎么样?公共子表达式?连接算法?
(1)尽可能先做选择运算
(2)投影运算和选择运算应同时进行
(3)把投影和其前后的双目运算结合起来
(4)把某些选择与在它前面要执行的笛卡尔积结合起来成为一个连接运算
(5)找出公共子表达式
(6)选取合适的连接算法
2.试述关系数据库管理系统查询优化的一般步骤。
记忆:画语法树,优化,存取路径,查询计划
(1)把查询转换成某种内部表示,通常用的内部表示是语法树
(2)利用优化算法,优化语法树
(3)选择低层的存取路径
(4)生成查询计划并选择其中代价最小的一种
事务(transaction):用户定义的一个数据库操作序列,不做或全做,这个工作单位不可分割。
显式定义事务
BEGIN TRANSACTION;
COMMIT; //正常结束,提交,所有更新写回物理数据库
ROLLBACK; //发生错误,回滚,事务中发生的操作全部撤销
★事务的ACID特性
事务ACID遭破坏的可能因素:
分类:
事务故障&系统故障:记录事务更新对象旧值和新值(日志文件),回滚未提交的事务(恢复为旧值),重做已提交的事务(更新为新值),(日志logging技术)
介质故障:重载备份(数据备份backup技术)
数据转储(数据备份backup技术)
静态备份:备份开始时处于一致性状态,且没有事务正在进行(优:实现简单;缺:必须等待事务结束,新事务等待备份结束)
动态备份:备份操作与用户事务并发进行(优:不用等待结束,不会影响新事务进行;缺:仅依靠后备副本无法保证数据有效)
全量备份
增量备份
登记日志文件(日志logging技术)
Undo日志:先写日志,后写数据,最后写提交标记
Redo日志:先写日志,再写提交标记,最后写数据
Undo/Redo日志:先写日志,后写数据
★为什么要先写日志,后写数据?
事务故障:
系统故障:
正向扫描日志文件,找出故障发送前已提交的事务(有BEGIN TRANSACTION 和 COMMIT),放入REDO-LIST。找出故障时尚未完成的事务(只有BEGIN TRANSACTION 但无 COMMIT),放入UNDO-LIST。
对UNDO-LIST中的事务做撤销(反向扫描日志文件,对每个更新操作做逆操作,即“更新前的值”写入数据库)
对REDO-LIST中的事务做重做(正向扫描日志文件,重新执行日志文件登记操作,即“更新后的值”写入数据库)
介质故障:
问题:搜索整个日志很耗时,重新执行浪费大量时间,日志存储代价很大。为了解决这个问题,新增检查点。
检查点记录{①建立检查点时刻所有正在执行的事务清单 ②这些事务最近一个日志记录的地址}
重新开始文件:存放各个检查点在日志文件中的地址
利用检查点恢复的步骤:
具体案例:
复制主数据库到别的地方,可以同时便利并发操作的读取。
单处理机系统中,事务的并行执行实际上是这些并发事务的并行操作轮流交叉运行。称为:交叉并发方式。
事务是并发控制的基本单位。目标是保证事务的隔离性和一致性。
并发操作带来的不一致性主要有:
并发控制的主要技术:封锁(locking),时间戳(timestamp),乐观方法,多版本并发控制
由低到高(数据一致性增强,系统代价增高):
封锁:事务T对某个数据对象操作前先向系统申请加锁
基本封锁类型:
相容矩阵:只有S锁和S锁自己可相容,另:空跟别的都可相容
三级封锁协议:定义何时申请锁,持续时间,何时释放
活锁
原因:多个事务请求同一个,但有可能先允许了后面的事务,导致前面的事务一直等待,饿死。
解决方法:采取先来先服务的策略
死锁
原因:T1和T2各自封锁对方想要获得的资源,并同时请求自己想要获得的资源
死锁的预防;
死锁的诊断与解除:
调度不同,可能结果不同,存在一种正确调度。
串行调度:(串行调度的并发执行必然是正确的)
可串行化调度:这种调度方式产生的结果与某次串行调度产生的结果相同。(可串行化调度的并发执行是正确的)
冲突可串行化调度:这种调度在保证冲突操作次序不变的情况下,通过交换两个事务不冲突操作的次序得到的另一个调度是串行的,则该事务是冲突可串行化的,也必然是可串行化的(充分条件:冲突可串行化→可串行化)
冲突操作:不同事务对同一数据的读写/写写操作
【不同事务的冲突操作】和【同一事务的两个操作】顺序不能互换
做题:判断一个调度是否冲突可串行化调度?在规则允许的范围内尽可能交换事务中各语句的次序,使得事务能尽可能分离开来,变成串行的,如果能办到,就是冲突可串行化调度。
【期末考试8分】例题:R3(B)R1(A)W3(B)R2(B)R2(A)W2(B)R1(B)W1(A),该调度是冲突可串行化的调度吗?为什么?
对原式中R1(A)依次与右边的邻居交换最终得到R3(B)W3(B)R2(B)R2(A)W2(B)R1(A)R1(B)W1(A)这是一个串行调度,故原调度是冲突可串行化调度。
为了保证调度可串行化,使用两段封锁(two-phase lock,2PL)来实现可串行化。
遵守两段锁协议的一定是可串行化的。
所有事务必须分两个阶段对数据项加锁和解锁(读写之前申请封锁,释放锁后,不再申请和获得封锁)
★一次封锁法<>两段锁协议
一次封锁法遵守两段锁协议,但两段锁协议不要求一次封锁,故两段锁协议仍然可能发生死锁
封锁粒度:封锁对象的大小(可以是逻辑单元:属性值,属性值集合,元组,关系,索引项,整个索引,整个数据库;物理单元:数据页,索引页;物理记录等)
封锁粒度↑,并发度↓,系统开销↓
多粒度封锁
多粒度树(根节点表示整个数据库,往下层次依次关系,元组等)
多粒度封锁协议:允许该树中的每个节点被独立加锁,加一个节点的锁时,其子树上的节点都加锁
显式封锁:直接加到该节点的锁
隐式封锁:由于其上级节点被加锁而被加锁
意向锁:表明该节点的子树上的节点正在被加锁。对任意节点加锁时,其所有上层节点都要加意向锁。
具有意向锁的多粒度封锁方法,提高了系统并发度,减少了加锁和解锁开销。
【老师提供】数据库系统期末考试复习提纲(2023)
第一章 绪论
1.1 数据库的 4 个基本概念(数据、数据库、数据库管理系统和数据库系统)
数据,是描述事物的符号记录。
数据库(DB),是长期存储在计算机内、有组织、可共享的大量数据的集合。
数据库管理系统(DBMS),位于用户与OS之间的数据管理软件。
数据库系统(DBS),是由DB、DBMS及其应用开发工具、应用程序和DBA组成的存储、管理、处理和维护数据的系统。
1.2 数据库系统的特点、数据库系统与文件系统的区别与联系
1.3 数据模型及三要素
1.4 数据库系统的三级模式结构(外模式、模式、内模式)
数据库的二级映像功能与数据独立性(逻辑独立性、物理独立性)
第二章 关系数据库
2.1 码、主属性、非主属性、外码
2.2 关系代数 并、差、交、笛卡尔积、选择、投影、连接、除运算。
2.3 关系代数查询及关系运算
第三章 关系数据库标准语言 SQL
3.1 SQL 的基本概念,基本表、视图。
3.2 基本表及视图的定义、查询、更新
3.3 数据查询: 常用的 SQL 语句,常用的查询、修改、删除、分组、排序等 SQL 语句
3.4 能熟练使用聚集函数、通配符
3.5 多表连接查询、复合条件连接查询、嵌套查询
3.6 数据更新 插入数据、修改数据、删除数据
第四章 数据库安全性
4.1 数据库的安全性
4.2 实现数据库安全性控制常用的方法和技术
4.3 掌握用户、角色的创建及授权和收回权限
第五章 数据库的完整性
5.1 数据库的完整性
5.2 实体完整性、参照完整性、用户定义完整性
第六章 关系数据理论
6.1 对函数依赖、码、主属性、非主属性、外码等有深入的理解
6.2 掌握关系模式的基本函数依赖、关系模式的候选码
6.2 掌握规范化理论,能够判断给定关系模式的规范化程度
6.3 掌握模式的分解,能够按要求对给定关系模式进行分解,修改为符合更高一级的范式
第七章 数据库设计
7.1 掌握数据库的一般设计过程及每个阶段的主要任务。
7.2 根据语义设计系统的 E-R 图,并将 E-R 图转换为关系模式(写出关系名称和所有属性)
7.3 对数据库设计方面有自己独到的理解
第九章 关系查询处理和查询优化
9.1 理解关系数据库系统查询优化的主要规则及步骤
9.2 了解代数优化、物理优化
第十章 数据库恢复技术
10.1 对事务的基本概念及事务的 ACID 特性有一定的理解和掌握
【事务】
10.2 理解数据库系统中故障的种类
10.3 掌握数据库恢复技术(数据转储或数据备份、登记日志文件)
10.4 掌握并能熟练使用具有检查点的恢复技术。
第十一章 并发控制
11.1 并发控制及并发操作带来的数据不一致性
11.2 封锁技术及基本封锁类型(排他锁和共享锁)、三级封锁协议
11.3 活锁和死锁,死锁的预防、诊断与解除
11.4 可串行化调度及两段锁协议,判断一个并发调度是不是冲突可串行化调度。
【两段锁协议】
11.5 了解封锁粒度及多粒度封锁。