第一章 数据库系统概论期末复习详解
一、数据库系统核心概念与课程体系
(一)课程定位与教材
- 课程地位:计算机学科核心课程,国家级精品课程,对应教材为王珊、萨师煊编著的《数据库系统概论(第5版)》。
- 教材内容架构:
模块 涵盖章节 学习要求 基础篇 绪论、关系数据库、SQL语言等 本科生必读 设计与应用篇 关系数据理论、数据库设计等 理论与实践结合 系统篇 查询优化、恢复技术、并发控制等 本科生/研究生选读 新技术篇 第13-16章(数据库新技术) 拓展知识
(二)数据库系统四大核心概念(重点)
-
数据(Data)
- 定义:描述事物的符号记录,如数字、文字、图形、音频等。
- 特点:数据与语义不可分割,例如“95”可表示成绩、体重等不同含义。
- 示例:学生记录(李明,男,1995,江苏,计算机系,2013)。
-
数据库(Database, DB)
- 定义:长期存储在计算机内、有组织、可共享的大量数据集合。
- 起源:规范化“表(Table)”处理,由关系数据库之父E.F.Codd于1970年提出关系模型,奠定现代数据库基础。
- 示例:学生信息表、成绩单表等相互关联的表集合。
-
数据库系统(Database System, DBS)
- 组成:数据库(DB)、数据库管理系统(DBMS)、应用程序(DBAP)、数据库管理员(DBA)及计算机系统。
- 关系:DBS包含DB和DBMS,如“学生管理系统”是DBS,其中“学生表”是DB,SQL Server是DBMS。
-
数据库管理系统(Database Management System, DBMS)
- 定位:位于用户与操作系统之间的数据管理软件,如Oracle、MySQL。
- 用户角度功能:
- 数据定义(DDL):创建表结构,如
CREATE TABLE Student(...)。 - 数据操纵(DML):增删改查数据,如
INSERT INTO Student VALUES(...)。 - 数据控制(DCL):权限管理与完整性约束,如
GRANT SELECT ON Student TO user。 - 数据维护:备份、恢复、性能优化。
- 数据定义(DDL):创建表结构,如
- 系统角度功能:语言编译、查询优化、事务管理、安全控制等。
二、数据管理技术发展阶段(理解)
| 阶段 | 时间 | 硬件/软件背景 | 特点 | 缺点 |
|---|---|---|---|---|
| 人工管理阶段 | 20世纪40-50年代 | 无直接存取设备,无操作系统 | 数据不保存,程序管理数据 | 不共享、独立性差 |
| 文件系统阶段 | 20世纪50-60年代 | 磁盘出现,有文件系统 | 数据长期保存,文件系统管理 | 共享性差、冗余度高、一致性差 |
| 数据库系统阶段 | 20世纪60年代至今 | 大容量磁盘,DBMS出现 | 数据结构化、共享性高、独立性强 | 需DBMS统一管理 |
三、数据库系统特点(重点)
-
数据结构化
- 整个组织的数据按某种模型(如关系模型)结构化,而非零散存储。
- 示例:学生数据分为基本信息、选课记录等,通过学号关联。
-
冗余度低且易扩充
- 数据面向整个系统而非单个应用,减少重复存储。
- 示例:学生表和选课表共享学号,避免姓名等信息重复存储。
-
数据独立性高
- 物理独立性:数据物理存储改变(如磁盘格式)时,应用程序无需修改,由DBMS的模式/内模式映像保证。
- 逻辑独立性:数据逻辑结构改变(如增加字段)时,应用程序无需修改,由外模式/模式映像保证。
-
数据由DBMS统一管理和控制
- 安全性保护:防止非法访问,如设置用户权限。
- 完整性检查:保证数据正确性,如成绩必须在0-100之间。
- 并发控制:协调多用户操作,避免数据冲突。
- 数据库恢复:故障后恢复数据到正确状态。
四、数据模型(核心考点)
(一)数据模型分类与作用
-
概念模型(信息模型)
- 面向用户,用于数据库设计,如E-R图。
- 特点:语义表达能力强,易理解,如实体、属性、联系的抽象。
-
逻辑模型(DBMS支持)
- 面向计算机系统,包括:
- 关系模型:用二维表表示,如学生表、课程表。
- 层次模型:树形结构(已淘汰)。
- 网状模型:网状结构(已淘汰)。
- 面向计算机系统,包括:
-
物理模型
- 描述数据在磁盘上的存储方式,如索引结构、存储路径。
(二)E-R图(概念模型表示方法,重点)
-
基本元素与表示
- 实体:矩形,如
学生、课程。 - 属性:椭圆形,如
学号、姓名。 - 联系:菱形,如
选修,标注联系类型(1:1、1:n、m:n)。
- 实体:矩形,如
-
联系类型与实例
- 1:1联系:如“班级”与“班长”(一个班级只有一个班长,一个班长只属于一个班级)。
- 1:n联系:如“班级”与“学生”(一个班级有多个学生,一个学生只属于一个班级)。
- m:n联系:如“学生”与“课程”(一个学生可选多门课,一门课可被多个学生选)。
-
E-R图设计步骤
- 确定实体型(如仓库、零件、供应商)。
- 定义实体属性(如仓库号、面积)。
- 确定联系类型及属性(如“供应”联系的供应量)。
五、关系模型(重中之重)
(一)关系模型三要素
-
数据结构
- 用二维表(关系)表示,表中每行是元组,每列是属性,码唯一标识元组。
- 示例:
-- 学生表(关系模式) Student(学号, 姓名, 性别, 年龄, 所属系) - 规范要求:每列不可再分(原子性),不允许表中套表。
-
数据操作
- 集合操作:查询、插入、删除、修改,操作对象和结果均为关系。
- 示例:
SELECT * FROM Student WHERE 所属系='计算机'。
-
完整性约束
- 实体完整性:主码属性非空且唯一,如学号不能为NULL。
- 参照完整性:外码取值需为被参照表的主码值或NULL,如选课表的学号必须存在于学生表中。
- 用户定义完整性:自定义规则,如年龄在15-50之间,成绩在0-100之间。
(二)关系模式与术语对比
| 关系模型术语 | 一般表格术语 | 示例(学生表) |
|---|---|---|
| 关系模式 | 表头 | Student(学号, 姓名, 性别, …) |
| 关系 | 二维表 | 整个学生信息表 |
| 元组 | 行/记录 | 某一行学生数据(如“张三”的记录) |
| 属性 | 列 | “姓名”列 |
| 码 | 主键列 | “学号”列 |
六、概念模型向关系模型转换(设计核心)
(一)实体型转换规则
一个实体型转换为一个关系模式,属性为实体属性,码为实体码。
- 示例:
实体型:学生(学号,姓名,性别,年龄)→ 关系模式:Student(学号, 姓名, 性别, 年龄),主键为“学号”。
(二)联系转换规则(重点)
-
1:1联系
- 方案1:转换为独立关系模式,如
管理(教师号, 班级号),主键为“教师号”或“班级号”。 - 方案2:与任一端合并,如将“管理”联系合并到“班级”表:
班级(班级号, 名称, 教师号),外键为“教师号”。
- 方案1:转换为独立关系模式,如
-
1:n联系
- 方案1:独立关系模式,如
组成(学号, 班级号, 排名),主键为“学号”。 - 方案2:与n端合并,如
学生(学号, 姓名, 班级号, 排名),外键为“班级号”。
- 方案1:独立关系模式,如
-
m:n联系
- 必须转换为独立关系模式,码为各实体码的组合,如
选课(学号, 课程号, 成绩),主键为“(学号, 课程号)”。
- 必须转换为独立关系模式,码为各实体码的组合,如
-
多元联系(三个及以上实体)
- 转换为独立关系模式,码为各实体码组合,如
供应(供应商号, 项目号, 零件号, 供应量),主键为“(供应商号, 项目号, 零件号)”。
- 转换为独立关系模式,码为各实体码组合,如
七、数据库系统结构(三级模式与数据独立性)
(一)三级模式架构
-
模式(逻辑模式)
- 全局逻辑结构,如学生、课程、选课的关系模式定义,一个数据库只有一个模式。
-
外模式(子模式/用户模式)
- 用户视角的局部数据视图,如“学生成绩查询视图”只包含学号、姓名、课程名、成绩,一个数据库可有多外模式。
-
内模式(存储模式)
- 数据物理存储结构,如索引文件、数据块分布,一个数据库只有一个内模式。
(二)二级映像与数据独立性
-
外模式/模式映像
- 作用:保证逻辑独立性。当模式改变(如增加“入学年份”字段),修改映像使外模式不变,应用程序无需修改。
-
模式/内模式映像
- 作用:保证物理独立性。当存储结构改变(如更换磁盘存储方式),修改映像使模式不变,应用程序无需修改。
八、典型DBMS与考试要点
(一)主流DBMS
Oracle、DB2、SQL Server、MySQL(开源),均支持关系模型。
(二)常见题型与考点
-
单选题
- 例:( )是存储在计算机内有结构的数据的集合。(答案:B. 数据库)
- 考点:DB、DBS、DBMS的概念区分。
-
应用题
- 例:画出“学生-课程-教师”的E-R图,并转换为关系模式。
- 要点:确定m:n联系(学生选课)、1:n联系(教师授课),正确标注主键和外键。
-
概念辨析
- 例:解释“逻辑独立性”与“物理独立性”的区别。
- 答:逻辑独立性由外模式/模式映像保证,物理独立性由模式/内模式映像保证,前者针对逻辑结构修改,后者针对物理存储修改。
本章核心考点总结:
- 四大概念(数据、DB、DBS、DBMS)的定义与关系;
- E-R图的绘制与联系类型判断;
- 关系模型三要素及完整性约束;
- 概念模型向关系模型的转换规则;
- 三级模式与数据独立性的原理。
第二章 关系数据库期末复习详解
一、关系数据结构的形式化定义
(一)核心概念与基础术语
-
域(Domain)
- 定义:一组具有相同数据类型的值的集合,如整数、字符串、{男,女}等。
- 例:年龄的域为[15, 50],性别域为{男,女}。
-
笛卡尔积(Cartesian Product)
- 定义:给定域D₁,D₂,…,Dₙ,其笛卡尔积为所有可能的元组组合,记作D₁×D₂×…×Dₙ。
- 公式:若Dᵢ的基数为mᵢ,则笛卡尔积的基数M=∏mᵢ。
- 例:D₁={张清玫,刘逸},D₂={计算机专业,信息专业},则D₁×D₂有2×2=4个元组。
-
关系(Relation)
- 定义:笛卡尔积的子集,用二维表表示,表中每行是元组,每列是属性。
- 性质:
- 列同质(同类型数据);
- 元组无重复,顺序可交换;
- 分量为原子值(不可再分)。
-
关系模式(Relation Schema)
- 定义:对关系的描述,形式为R(U,D,DOM,F),简记为R(A₁,A₂,…,Aₙ)。
- 例:学生表模式Student(Sno,Sname,Ssex,Sage,Sdept)。
(二)关系的型与值
- 关系模式(型):静态描述,如Student表的结构。
- 关系(值):动态实例,如某时刻Student表中的具体数据。
二、关系代数运算(核心考点)
(一)传统集合运算(要求表结构相同)
| 运算 | 定义 | 示例(R与S结构均为A,B,C) |
|---|---|---|
| 并(∪) | 属于R或S的元组 | R∪S = {t |
| 差(-) | 属于R但不属于S的元组 | R-S = {t |
| 交(∩) | 同时属于R和S的元组 | R∩S = {t |
| 笛卡尔积(×) | R×S的所有元组组合 | 若R有m行n列,S有p行q列,则R×S有m×p行n+q列 |
例:
R = { (a1,b1,c1), (a1,b2,c2) },
S = { (a1,b2,c2), (a2,b2,c1) },
- R∪S = { (a1,b1,c1), (a1,b2,c2), (a2,b2,c1) }
- R-S = { (a1,b1,c1) }
(二)专门的关系运算
1. 选择(Selection)
- 定义:从关系R中选取满足条件F的元组,记为σ₉®。
- 示例:查询信息系学生:
σₛₚₑₚₜ='IS'(Student)或σ₅='IS'(Student)(5表示第5列)。
2. 投影(Projection)
- 定义:从R中选取若干属性列组成新关系,记为πₐ®。
- 示例:查询学生学号和姓名:
πₛₙₒ,ₛₙₐₘₑ(Student)或π₁,₂(Student)。
3. 连接(Join)
- θ连接:从R×S中选取AθB的元组,记为R ⋈ₐθB S。
- 等值连接(θ=“=”):选取A=B的元组。
- 自然连接:特殊等值连接,要求A=B且去重重复列,记为R ⋈ S。
- 外连接:保留悬浮元组(未匹配元组):
- 左外连接:保留左表全部元组;
- 右外连接:保留右表全部元组;
- 全外连接:保留左右表全部元组。
例:R(A,B,C)与S(B,E)的自然连接:
R ⋈ S = { t | t∈R×S 且 R.B=S.B }
4. 除(Division)
- 定义:给定R(X,Y)和S(Y,Z),R÷S结果为R中满足“X的象集包含S在Y上投影”的元组在X上的投影。
- 示例:查询选修全部课程的学生学号:
πₛₙₒ,ₙₒ(SC) ÷ πₙₒ(Course)
三、关系运算综合应用
(一)典型查询案例
例1:基础查询
- 需求:查询年龄<20岁的男生学号和姓名。
- 关系代数:
πₛₙₒ,ₛₙₐₘₑ(σₛₐ₉ₑ<20∧ₛₛₑₓ='男'(Student))
例2:连接查询
- 需求:查询学生学号、姓名及选课成绩(包括未选课学生)。
- 关系代数:
Student ⋈ₗₑ₣ₜ SC(左外连接),结果保留Student全部元组,SC无匹配时成绩为NULL。
例3:除运算应用
- 需求:查询选修课程号为1和3的学生学号。
- 步骤:
- 构造临时关系S={1,3};
- 计算
πₛₙₒ,ₙₒ(SC) ÷ S。
(二)易混淆概念对比
| 运算 | 区别 |
|---|---|
| 自然连接 vs 等值连接 | 自然连接自动去重重复属性,等值连接需显式指定A=B,可能保留重复列 |
| 内连接 vs 外连接 | 内连接仅保留匹配元组,外连接保留悬浮元组 |
| 投影 vs 选择 | 投影按列筛选,选择按行筛选 |
四、关系完整性约束(本章简提,后续深入)
- 实体完整性:主码非空且唯一。
- 参照完整性:外码取值为被参照表主码值或NULL。
- 用户定义完整性:如成绩∈[0,100]。
五、本章核心考点总结
- 关系数据结构:域、笛卡尔积、关系的性质。
- 关系代数运算:
- 传统运算:并、差、交、笛卡尔积的条件与结果;
- 专门运算:选择、投影的条件书写,连接(尤其是自然连接)的步骤,除运算的逻辑。
- 典型查询:多表连接、外连接应用、除运算解决“全部选修”问题。
复习建议:通过具体例题练习关系代数表达式的书写,重点掌握自然连接、外连接和除运算的逻辑,理解运算结果与实际需求的对应关系。
第三章 SQL语言期末复习详解
一、SQL数据定义
(一)数据库操作
-
创建数据库
CREATE DATABASE 数据库名 ON [PRIMARY] ( NAME = 逻辑文件名, FILENAME = '物理文件路径', SIZE = 初始大小, MAXSIZE = 最大大小, FILEGROWTH = 增长比例 ) LOG ON ( NAME = 日志逻辑名, FILENAME = '日志文件路径', ... );例:创建
mydb数据库,主数据文件初始5MB,日志文件初始3MB:CREATE DATABASE mydb ON (NAME = mydb_data, FILENAME = 'd:\data\mydb_data.mdf', SIZE = 5MB, FILEGROWTH = 2MB) LOG ON (NAME = mydb_log, FILENAME = 'd:\data\mydb_log.ldf', SIZE = 3MB); -
修改数据库
- 添加数据文件:
ALTER DATABASE 数据库名 ADD FILE (NAME = 文件名, ...) TO FILEGROUP 组名; - 添加日志文件:
ALTER DATABASE 数据库名 ADD LOG FILE (NAME = 日志名, ...); - 删除文件/文件组(需先清空文件):
ALTER DATABASE 数据库名 REMOVE FILE 逻辑名;
- 添加数据文件:
-
删除数据库
DROP DATABASE 数据库名;
(二)表操作
-
创建表
CREATE TABLE 表名 ( 列名 数据类型 [NULL/NOT NULL], 列名 数据类型 [DEFAULT 默认值], [PRIMARY KEY (列名)], [FOREIGN KEY (列名) REFERENCES 主表(主键列)] );例:创建学生表:
CREATE TABLE Student ( Sno CHAR(9) PRIMARY KEY, Sname VARCHAR(20) NOT NULL, Ssex CHAR(2) DEFAULT '男', Sdept VARCHAR(20) ); -
修改表结构
- 添加列:
ALTER TABLE 表名 ADD 新列名 数据类型 [约束]; - 修改列:
ALTER TABLE 表名 ALTER COLUMN 列名 新数据类型; - 删除列:
ALTER TABLE 表名 DROP COLUMN 列名;
- 添加列:
-
删除表
DROP TABLE 表名;
(三)索引操作
-
创建索引
- 普通索引:
CREATE INDEX 索引名 ON 表名(列名 [ASC/DESC]); - 唯一索引:
CREATE UNIQUE INDEX 索引名 ON 表名(列名); - 聚簇索引(物理排序):
CREATE CLUSTERED INDEX 索引名 ON 表名(列名);
- 普通索引:
-
删除索引
DROP INDEX 表名.索引名;
二、SQL数据查询(核心考点)
(一)单表查询
-
基本语法
SELECT [DISTINCT] 列名1, 列名2,... FROM 表名 [WHERE 条件] [ORDER BY 列名 [ASC/DESC]]; -
条件查询
- 比较运算符:
=, >, <, BETWEEN...AND, IN - 模糊查询:
LIKE '%pattern%'(%任意长度,_单个字符) - 空值判断:
IS NULL / IS NOT NULL
例:查询信息系(IS)年龄<20岁的学生:
SELECT Sname, Sage FROM Student WHERE Sdept = 'IS' AND Sage < 20; - 比较运算符:
(二)聚集查询
-
聚集函数
COUNT(*):计数SUM(列):求和AVG(列):平均MAX/MIN(列):最大/最小值
例:查询各系平均年龄:
SELECT Sdept, AVG(Sage) FROM Student GROUP BY Sdept; -
分组与筛选
GROUP BY:分组HAVING:分组后筛选(区别于WHERE)
例:查询选课数≥2的学生学号:
SELECT Sno, COUNT(Cno) FROM SC GROUP BY Sno HAVING COUNT(Cno) >= 2;
(三)连接查询
-
内连接(INNER JOIN)
SELECT 列名 FROM 表1 [INNER] JOIN 表2 ON 表1.列 = 表2.列;例:查询学生成绩:
SELECT Student.Sno, Sname, Grade FROM Student JOIN SC ON Student.Sno = SC.Sno; -
外连接
- 左外连接(保留左表全部):
SELECT ... FROM 表1 LEFT [OUTER] JOIN 表2 ON 条件; - 右外连接(保留右表全部):
SELECT ... FROM 表1 RIGHT [OUTER] JOIN 表2 ON 条件; - 全外连接(保留两表全部):
SELECT ... FROM 表1 FULL [OUTER] JOIN 表2 ON 条件;
- 左外连接(保留左表全部):
-
自身连接
例:查询课程先修课:SELECT C1.Cno, C2.Cpno FROM Course C1 JOIN Course C2 ON C1.Cpno = C2.Cno;
(四)嵌套查询
-
IN子查询
例:查询与“刘晨”同系的学生:SELECT Sname FROM Student WHERE Sdept IN (SELECT Sdept FROM Student WHERE Sname = '刘晨'); -
比较运算符子查询
例:查询年龄大于平均年龄的学生:SELECT Sname FROM Student WHERE Sage > (SELECT AVG(Sage) FROM Student); -
EXISTS子查询(相关子查询)
例:查询选修了1号课程的学生:SELECT Sname FROM Student WHERE EXISTS (SELECT * FROM SC WHERE Sno = Student.Sno AND Cno = '1');
(五)集合查询
-
并(UNION):去重合并
SELECT ... FROM 表1 UNION SELECT ... FROM 表2; -
交(INTERSECT):取公共部分
SELECT ... FROM 表1 INTERSECT SELECT ... FROM 表2; -
差(EXCEPT):左表减右表
SELECT ... FROM 表1 EXCEPT SELECT ... FROM 表2;
三、SQL数据更新
(一)插入数据
-
单条插入
INSERT INTO 表名(列1,列2) VALUES(值1,值2);例:插入学生记录:
INSERT INTO Student(Sno, Sname, Sdept) VALUES('2023001', '张三', 'CS'); -
子查询插入
INSERT INTO 表名 SELECT ... FROM 表2;
(二)修改数据
UPDATE 表名 SET 列1=值1, 列2=值2 WHERE 条件;
例:将CS系学生年龄+1:
UPDATE Student SET Sage = Sage + 1 WHERE Sdept = 'CS';
(三)删除数据
DELETE FROM 表名 WHERE 条件;
例:删除未选课学生:
DELETE FROM Student WHERE Sno NOT IN (SELECT Sno FROM SC);
四、视图(View)
(一)创建视图
CREATE VIEW 视图名 AS SELECT ... FROM 表 WHERE 条件;
例:创建信息系学生视图:
CREATE VIEW IS_Student AS
SELECT Sno, Sname, Sage FROM Student WHERE Sdept = 'IS';
(二)使用视图
SELECT ... FROM 视图名 WHERE 条件;
(三)删除视图
DROP VIEW 视图名;
五、核心考点总结
- SQL语句结构:
SELECT-FROM-WHERE-GROUP BY-HAVING-ORDER BY的执行顺序。 - 连接查询:内连接、外连接的区别与应用场景。
- 嵌套查询:
IN、EXISTS、ANY/ALL的使用,相关子查询与不相关子查询的区别。 - 数据完整性:主键、外键、默认值等约束的创建与作用。
- 性能优化:索引的合理创建,避免全表扫描。
复习建议:通过大量练习掌握SQL语句书写,重点关注连接查询和嵌套查询的复杂场景,理解视图与表的本质区别,以及数据更新时的完整性约束规则。
第四章 数据库安全性期末复习总结
一、数据库安全性概述
(一)基本概念
- 定义:保护数据库免受非法使用,防止数据泄露、更改或破坏。
- 威胁来源:
- 非授权用户的恶意存取和破坏(如黑客假冒合法用户)。
- 敏感数据泄露(如军事、金融数据被窃取)。
- 安全环境脆弱(如操作系统、网络协议漏洞)。
(二)安全性控制层次
- 用户标识与鉴定:最外层保护,验证用户身份(如静态口令、动态口令、生物特征)。
- 存取控制:限制用户对数据对象的操作权限。
- 视图机制:屏蔽敏感数据,仅向用户暴露允许访问的数据。
- 审计:记录用户操作,追踪非法行为。
- 密码存储:加密存储数据,防止明文泄露。
二、存取控制技术(核心考点)
(一)自主存取控制(DAC)
-
权限定义:用户对不同数据对象有不同权限,可转授权限。
-
SQL实现:
- 授权:
GRANT <权限> ON <对象> TO <用户> [WITH GRANT OPTION]- 例:授予U1对Student表的查询权限:
GRANT SELECT ON TABLE Student TO U1;
- 例:授予U1对Student表的查询权限:
- 转授权限:若指定
WITH GRANT OPTION,用户可将权限再授予他人。 - 收回权限:
REVOKE <权限> ON <对象> FROM <用户> [CASCADE]- 例:收回U1对Student表的更新权限:
REVOKE UPDATE ON TABLE Student FROM U1;
- 例:收回U1对Student表的更新权限:
- 授权:
-
权限对象与操作:
对象类型 对象 操作类型 数据库模式 模式 CREATE SCHEMA 基本表 表 CREATE TABLE、ALTER TABLE、SELECT等 视图 视图 CREATE VIEW、SELECT等 数据 表/视图属性列 SELECT、INSERT、UPDATE等
(二)强制存取控制(MAC)
- 核心思想:对数据和用户强制标记密级,用户只能按密级访问数据。
- 敏感标记:
- 主体(用户/进程):许可证级别(如绝密TS、机密S、可信C、公开P)。
- 客体(数据对象):密级(同上)。
- 访问规则:
- 读取:主体许可证级别 ≥ 客体密级。
- 写入:主体许可证级别 ≤ 客体密级。
三、角色与权限管理
(一)角色的作用
- 简化权限管理,将相同权限打包分配给多个用户。
- 例:创建角色R1并授权:
CREATE ROLE R1; GRANT SELECT, INSERT ON TABLE Student TO R1; GRANT R1 TO 王平, 张明; -- 授予用户角色
(二)固定角色分类
- 服务器角色(如sysadmin、dbcreator):管理服务器级权限。
- 数据库角色(如db_owner、db_datareader):管理数据库级权限。
四、视图与安全性
- 屏蔽敏感数据:通过视图限制用户可见数据。
- 例:创建CS系学生视图并授权:
CREATE VIEW CS_Student AS SELECT * FROM Student WHERE Sdept='CS'; GRANT SELECT ON CS_Student TO 王平;
- 例:创建CS系学生视图并授权:
- 与授权结合:视图+权限进一步细化控制。
五、审计与数据加密
(一)审计(Audit)
- 功能:记录用户对数据库的操作,用于追踪非法行为。
- 适用场景:高安全需求系统(如银行、军事)。
(二)数据加密
- 目的:防止数据在存储和传输中泄露。
- 分类:
- 存储加密:加密存储数据文件。
- 传输加密:加密网络传输数据。
六、典型例题与考点
(一)选择题高频考点
- 存取控制核心语句:GRANT(授权)和REVOKE(收权)用于维护数据库安全性。
- 视图的作用:提高数据库安全性,屏蔽敏感数据。
- 强制存取控制规则:主体读数据需许可证级别≥客体密级,写数据需≤客体密级。
(二)应用题示例
例:简述自主存取控制与强制存取控制的区别。
- 自主存取控制:用户自主管理权限,可转授,灵活性高但安全性较低。
- 强制存取控制:系统强制管理密级,用户无法自主修改,安全性更高,适用于密级严格场景。
七、本章总结
数据库安全性通过多层控制实现,核心是存取控制技术。自主存取控制通过GRANT/REVOKE实现灵活权限管理,强制存取控制通过密级标记实现更严格的安全保障。视图、审计和加密作为补充手段,共同构建完整的安全体系。复习时需重点掌握SQL授权语句的使用及角色管理,理解不同安全技术的应用场景。
第五章 数据库完整性期末复习总结
一、数据库完整性概述
(一)基本概念
- 定义:保证数据的正确性(符合语义)和相容性(不同表间逻辑一致)。
- 例:学号唯一、年龄范围合法、选课必须存在对应课程。
- 与安全性的区别:
- 安全性:防止非法访问(防范非法用户);
- 完整性:防止不合语义的数据(防范无效数据)。
(二)完整性约束类型
- 实体完整性:主码非空且唯一。
- 参照完整性:外码需引用主码或为空。
- 用户定义完整性:自定义语义约束(如年龄范围、性别限制)。
二、实体完整性与参照完整性
(一)实体完整性(主码约束)
- 定义方式:
CREATE TABLE Student ( Sno CHAR(9) PRIMARY KEY, -- 列级定义主码 Sname CHAR(20) NOT NULL, ... ); - 检查机制:
- 插入/修改时检查主码唯一性(通过索引快速查询,避免全表扫描)。
(二)参照完整性(外码约束)
- 定义方式:
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 Course(Cno) ); - 违约处理:
- NO ACTION(默认):拒绝操作;
- CASCADE:级联更新/删除;
- SET NULL:设为空值。
-- 级联删除示例 FOREIGN KEY (Sno) REFERENCES Student(Sno) ON DELETE CASCADE;
三、用户定义完整性
(一)属性级约束
- 非空约束:
NOT NULL - 唯一约束:
UNIQUE - 检查约束:
CHECKCREATE TABLE Student ( Sage SMALLINT CHECK (Sage BETWEEN 14 AND 50), Ssex CHAR(2) CHECK (Ssex IN ('男', '女')) );
(二)元组级约束
- 跨属性约束(如性别与姓名的关联):
CREATE TABLE Student ( ... CHECK (Ssex='女' OR Sname NOT LIKE 'Ms.%') -- 元组级约束 );
(三)完整性约束命名与修改
- 命名子句:
CREATE TABLE Student ( Sno NUMERIC(6) CONSTRAINT C1 CHECK (Sno BETWEEN 90000 AND 99999), ... ); - 修改约束:
ALTER TABLE Student DROP CONSTRAINT C1; -- 删除约束 ALTER TABLE Student ADD CONSTRAINT C1 CHECK (Sno BETWEEN 900000 AND 999999); -- 添加新约束
四、断言(Assertion)
- 功能:定义跨表或聚集操作的复杂约束,任何更新触发检查。
- 创建方式:
-- 限制每门课程最多60人选修 CREATE ASSERTION ASSE_SC_CNUM1 CHECK (60 >= ALL (SELECT COUNT(*) FROM SC GROUP BY Cno)); - 删除方式:
DROP ASSERTION ASSE_SC_CNUM1;
五、T-SQL基础(补充)
(一)变量与赋值
- 局部变量:以
@开头,需先声明后使用。DECLARE @Sno CHAR(9), @Grade INT; SET @Grade = 90; -- 单变量赋值 SELECT @Sno = Sno FROM Student WHERE Sname = '张三'; -- 从查询赋值 - 表变量:临时存储结果集。
DECLARE @MyTable TABLE (Sno CHAR(9), AvgGrade FLOAT); INSERT INTO @MyTable SELECT Sno, AVG(Grade) FROM SC GROUP BY Sno;
(二)流程控制
- IF语句:
IF (SELECT AVG(Grade) FROM SC WHERE Sno='201215121') < 75 BEGIN UPDATE SC SET Grade = Grade * 1.05 WHERE Sno='201215121'; IF (SELECT MIN(Grade) FROM SC WHERE Sno='201215121') >= 60 BREAK; -- 跳出循环 END - CASE语句:
-- 成绩等级转换 SELECT Grade, CASE WHEN Grade >= 90 THEN '优' WHEN Grade >= 80 THEN '良' ... ELSE '不及格' END AS GradeLevel FROM SC; - WHILE循环:
DECLARE @i INT = 1, @sum INT = 0; WHILE @i <= 10 BEGIN SET @sum = @sum + @i; SET @i = @i + 1; END;
六、触发器(Trigger)
(一)触发器类型
- AFTER触发器:在DML操作后触发。
- INSTEAD OF触发器:替代原始操作(可用于视图)。
(二)触发事件
INSERT、UPDATE、DELETE(可组合使用)。
(三)临时表机制
| 操作 | inserted表 | deleted表 |
|---|---|---|
| INSERT | 存储新插入行 | 空 |
| DELETE | 空 | 存储删除行 |
| UPDATE | 存储更新后行 | 存储更新前行 |
(四)实例:插入检查
-- 限制只有女生能选7号课程
CREATE TRIGGER tr_sc_insert
ON SC
AFTER INSERT
AS
BEGIN
DECLARE @Sno CHAR(9), @Cno CHAR(4);
SELECT @Sno = Sno, @Cno = Cno FROM inserted;
IF @Cno = '7' AND NOT EXISTS (SELECT 1 FROM Student WHERE Sno=@Sno AND Ssex='女')
BEGIN
PRINT '选7号课程的必须是女生';
ROLLBACK TRANSACTION; -- 回滚操作
END
END;
(五)实例:更新检查
-- 年龄修改时新值必须大于旧值
CREATE TRIGGER tr_student_sage
ON Student
AFTER UPDATE
AS
BEGIN
IF EXISTS (SELECT 1 FROM inserted i JOIN deleted d ON i.Sno=d.Sno WHERE i.Sage <= d.Sage)
BEGIN
PRINT '年龄必须增大';
ROLLBACK TRANSACTION;
END
END;
(六)实例:删除日志
-- 删除SC记录时备份到SC1
CREATE TRIGGER tr_sc_delete
ON SC
AFTER DELETE
AS
BEGIN
INSERT INTO SC1 SELECT * FROM deleted;
END;
七、核心考点总结
- 完整性约束语法:主码、外码、CHECK约束的定义与应用。
- 参照完整性违约处理:NO ACTION、CASCADE、SET NULL的区别。
- 触发器工作原理:inserted/deleted表的作用,触发时机选择。
- T-SQL流程控制:IF、CASE、WHILE在触发器中的应用。
- 断言与触发器的选择:复杂跨表约束用断言,实时数据检查用触发器。
复习建议:通过实际案例练习约束定义和触发器编写,重点掌握外码级联规则和触发器临时表的使用逻辑。
第六章 关系数据库理论期末复习总结
一、关系模式设计问题
(一)数据依赖与异常
- 问题示例
- 单一模式:
Student(Sno, Sname, Sdept, Mname, Cno, Grade) - 问题:数据冗余(系主任姓名重复)、更新异常(修改系主任需更新所有相关元组)、插入异常(未选课学生信息无法插入)、删除异常(删除课程可能丢失学生信息)。
- 单一模式:
- 解决方案:分解为高范式关系模式,如:
S(Sno, Sname, Sdept), DEPT(Sdept, Mname), SC(Sno, Cno, Grade)
二、函数依赖(核心概念)
(一)基本定义
- 函数依赖(X→Y):若X值确定,Y值唯一确定。
- 例:
Sno→Sname,(Sno,Cno)→Grade。
- 例:
- 分类
- 平凡/非平凡:若Y⊆X为平凡依赖(如
(Sno,Cno)→Cno),否则非平凡。 - 完全/部分:Y完全依赖X(
(Sno,Cno)→Grade),否则部分依赖((Sno,Cno)→Sdept,因Sno→Sdept)。 - 传递依赖:若X→Y,Y→Z且Y↛X,则X→Z传递依赖(如
Sno→Sdept→Mname)。
- 平凡/非平凡:若Y⊆X为平凡依赖(如
(二)Armstrong公理系统
- 推理规则
- 自反律:Y⊆X→X→Y。
- 增广律:X→Y→XZ→YZ。
- 传递律:X→Y,Y→Z→X→Z。
- 导出规则
- 合并规则:X→Y,X→Z→X→YZ。
- 分解规则:X→YZ→X→Y,X→Z。
- 属性闭包
- 定义:
X_F⁺为X能决定的所有属性。 - 算法:从X出发,反复添加能由X决定的属性,直至无法扩展。
- 应用:判断函数依赖是否成立(如
AC→D是否成立,计算(AC)_F⁺是否包含D)。
- 定义:
三、范式(Normal Form)
(一)各级范式定义与判断
| 范式 | 定义条件 | 核心要求 | 示例 |
|---|---|---|---|
| 1NF | 属性不可再分 | 无复合属性 | Student初始模式 |
| 2NF | 非主属性完全依赖码 | 消除部分依赖 | 分解后SC(Sno,Cno,Grade) |
| 3NF | 非主属性无传递依赖 | 消除传递依赖 | 分解后S(Sno,Sname,Sdept) |
| BCNF | 所有函数依赖的决定因素是超键 | 主属性无不良依赖 | SJP(S,J,P)(候选码(S,J)和(J,P)) |
(二)规范化步骤
- 1NF→2NF:消除非主属性对码的部分依赖。
- 例:
Student分解为SD(Sno,Sname,Sdept,Mname)和SC(Sno,Cno,Grade)。
- 例:
- 2NF→3NF:消除非主属性对码的传递依赖。
- 例:
SD分解为S(Sno,Sname,Sdept)和Dept(Sdept,Mname)。
- 例:
- 3NF→BCNF:消除主属性对码的不良依赖。
- 例:
STJ(S,T,J)(T→J)分解为ST(S,T)和TJ(T,J)。
- 例:
四、模式分解(关键技术)
(一)分解原则
- 无损连接性:分解后能通过自然连接还原原关系。
- 保持函数依赖:分解后函数依赖集不变。
(二)分解方法示例
- 问题模式:
Teacher(tnum,tname,dept,manager,address,cnum,cname,score)- 函数依赖:
tnum→tname, tnum→dept, dept→manager, dept→address, cnum→cname, (tnum,cnum)→score - 候选码:(tnum,cnum)
- 函数依赖:
- 分解步骤
- →2NF:消除部分依赖,分解为:
T(tnum,tname,dept,manager,address), C(cnum,cname), TC(tnum,cnum,score) - →3NF:消除传递依赖,分解为:
T(tnum,tname,dept), D(dept,manager,address), C(cnum,cname), TC(tnum,cnum,score)
- →2NF:消除部分依赖,分解为:
五、核心考点与解题思路
(一)候选码求解
- 步骤
- 找出所有不在函数依赖右侧出现的属性,构成初始集P。
- 计算P的闭包,若P⁺=U则P为候选码;否则添加属性直至闭包为U。
- 例:
R(A,B,C,D), F={AB→C, C→D, D→A}- 右侧无B,P={B},计算
B⁺=B≠U,添加A得AB⁺=ABCD=U,候选码为AB。
- 右侧无B,P={B},计算
(二)范式判断步骤
- 1NF:检查属性是否原子。
- 2NF:检查非主属性是否完全依赖码(部分依赖存在则≠2NF)。
- 3NF:检查非主属性是否传递依赖码(传递依赖存在则≠3NF)。
- BCNF:检查所有函数依赖的决定因素是否为超键。
(三)典型例题
- 题目:
supply(sno,pno,scity,status,qty), F={sno→scity, scity→status, (sno,pno)→qty}- 候选码:(sno,pno)(因
(sno,pno)_F⁺=sno,pno,scity,status,qty)。 - 范式:2NF(status传递依赖于(sno,pno),因
sno→scity→status)。 - 分解:
S(sno,scity,status), SP(sno,pno,qty)
- 候选码:(sno,pno)(因
六、总结与注意事项
- 规范化目的:解决数据冗余和异常,提升数据一致性。
- 并非越高越好:需平衡规范化与应用需求(如偶尔冗余可提高查询效率)。
- 核心工具:属性闭包计算、函数依赖推导、模式分解算法。
复习建议:通过具体案例练习范式判断和分解,熟练掌握Armstrong公理及闭包计算步骤。
第八章 数据库编程期末复习总结
一、嵌入式SQL
(一)基本概念
- 定义:将SQL语句嵌入到C、C++、Java等主语言中,形成嵌入式SQL程序。
- 两种使用方式:
- 交互式SQL:直接在数据库客户端执行。
- 嵌入式SQL:需与主语言结合,需进行必要扩充(如宿主变量、游标处理)。
二、存储过程(核心考点)
(一)存储过程概述
-
定义:一组预编译的SQL语句集,存储在数据库中,可通过名称调用。
-
优点:
- 模块化编程:封装重复逻辑,可重用。
- 快速执行:编译后存储,执行效率高。
- 减少网络通信:客户端只需调用存储过程名,而非传输多条SQL。
- 安全机制:可控制用户对存储过程的访问权限。
-
分类:
- 系统存储过程:以
sp_为前缀,由SQL Server提供(如sp_addrolemember)。 - 用户自定义存储过程:用户创建,完成特定功能。
- 系统存储过程:以
(二)存储过程的创建与调用
-
创建语法:
CREATE PROC[EDURE] 存储过程名 [@参数 数据类型=默认值 [OUTPUT]] [WITH ENCRYPTION] AS SQL语句集;- 示例:计算两数之和
CREATE PROCEDURE add_two @p1 INT, @p2 INT AS DECLARE @sum INT SET @sum = @p1 + @p2 PRINT @sum;
- 示例:计算两数之和
-
调用语法:
EXEC[UTE] 存储过程名 [@参数=值 | @变量 [OUTPUT]];- 示例:调用
add_twoEXEC add_two 120, 50; -- 直接传值 EXEC add_two @p2=50, @p1=120; -- 命名参数传值
- 示例:调用
(三)参数处理
- 输入参数:默认参数,用于传入数据(如查询条件)。
CREATE PROCEDURE usp_getcourse @name VARCHAR(40)='%' AS SELECT * FROM course WHERE cname LIKE @name; - 输出参数:使用
OUTPUT关键字,返回处理结果。CREATE PROCEDURE proc_avergrade @sno VARCHAR(10), @savg FLOAT OUTPUT AS SELECT @savg = AVG(grade) FROM sc WHERE sno = @sno;- 调用:
DECLARE @avg FLOAT EXEC proc_avergrade '201215121', @avg OUTPUT PRINT '平均成绩:' + CONVERT(VARCHAR, @avg);
- 调用:
(四)存储过程管理
- 查看存储过程:
sp_help 存储过程名:查看参数信息。sp_helptext 存储过程名:查看源代码(若未加密)。
- 加密存储过程:
CREATE PROCEDURE add_two2 @p1 INT, @p2 INT WITH ENCRYPTION AS ... -- 加密后无法通过sp_helptext查看源码 - 删除存储过程:
DROP PROCEDURE 存储过程名;
三、ODBC(开放数据库连接)
(一)核心作用
- 提供统一接口,允许应用程序通过SQL访问不同DBMS(如Oracle、SQL Server),解决异构数据库共享问题。
(二)体系结构
- 四层结构:
- 用户应用程序:调用ODBC接口。
- ODBC驱动程序管理器:管理驱动程序加载。
- 数据库驱动程序:与具体数据库交互。
- 数据源:具体数据库实例。
四、JDBC(Java数据库连接)
(一)基本概念
- Java语言的数据库访问API,由Java类和接口组成,支持执行SQL语句,开发纯Java数据库应用。
五、核心考点总结
- 存储过程创建与调用:重点掌握参数定义(输入/输出)、默认值设置、加密选项。
- 存储过程应用场景:复杂业务逻辑封装、性能优化(减少网络传输)、权限控制。
- ODBC与JDBC对比:均为数据库连接标准,ODBC跨语言,JDBC专用于Java。
复习建议:通过实例练习存储过程编写,注意参数传递方式和输出参数的使用,理解ODBC/JDBC在异构数据库访问中的作用。
第九章 数据库恢复技术期末复习总结
一、事务的基本概念
(一)事务的定义
- 定义:用户定义的一组数据库操作序列,这些操作要么全做,要么全不做,是数据库的基本执行单元。
- 示例:银行转账事务包含从账户A扣款和向账户B存款,两者必须同时成功或失败。
(二)事务的ACID特性(核心考点)
| 特性 | 含义 | 示例 |
|---|---|---|
| 原子性 | 事务中的操作要么全做,要么全不做 | 转账时扣款和存款必须同时完成,否则回滚 |
| 一致性 | 事务执行后数据库从一个一致状态变为另一个一致状态 | 转账前后A+B的总金额不变 |
| 隔离性 | 并发执行的事务互不干扰,一个事务的执行不被其他事务影响 | 多个用户同时转账时,彼此数据互不干扰 |
| 持久性 | 事务提交后,其对数据库的修改永久有效,不受故障影响 | 转账成功后,即使系统崩溃,数据也不会丢失 |
二、数据库故障类型及影响
(一)故障分类与特点
| 故障类型 | 原因 | 影响范围 | 破坏的特性 |
|---|---|---|---|
| 事务内部故障 | 运算溢出、死锁、完整性违反等 | 仅当前事务 | 原子性、一致性 |
| 系统故障(软故障) | CPU故障、操作系统错误、断电等 | 所有正在运行的事务 | 原子性、一致性、持久性 |
| 介质故障(硬故障) | 磁盘损坏、磁头碰撞等 | 数据库物理损坏 | 所有数据及事务 |
| 计算机病毒 | 恶意程序攻击 | 数据库或事务 | 一致性、持久性 |
(二)典型场景
- 事务内部故障:转账时账户余额不足,事务回滚。
- 系统故障:服务器断电,未提交事务丢失,已提交事务可能未写入磁盘。
- 介质故障:硬盘损坏导致数据库文件丢失,需重装后备副本。
三、数据库恢复技术核心手段
(一)建立冗余数据
-
数据转储(Backup)
- 定义:将数据库复制到后备存储介质,形成后备副本。
- 分类:
- 静态转储:转储期间禁止事务,数据一致但影响可用性。
- 动态转储:转储期间允许事务,需结合日志文件保证一致性。
- 海量转储:转储全部数据库,恢复方便但耗时。
- 增量转储:只转储更新数据,节省时间空间。
- 策略:定期进行海量转储(如每月),每日增量转储,结合日志文件。
-
日志文件(Log File)
- 作用:记录事务对数据库的更新操作,用于故障恢复。
- 格式:以记录为单位,包含事务标识、操作类型、对象、旧值和新值。
- 原则:先写日志,后写数据库,确保故障时可恢复。
(二)故障恢复步骤(重点)
1. 事务故障恢复(事务未正常结束)
- 步骤:
- 反向扫描日志,查找该事务的更新操作。
- 对每个更新操作执行逆操作(如插入→删除,修改→还原旧值)。
- 直至找到事务开始标记,完成回滚。
2. 系统故障恢复(系统重启)
- 步骤:
- 正向扫描日志,区分事务状态:
- 重做队列(Redo):已提交但未写入磁盘的事务。
- 撤销队列(Undo):未完成的事务。
- 对撤销队列中的事务反向扫描日志,执行逆操作。
- 对重做队列中的事务正向扫描日志,重新执行操作。
- 正向扫描日志,区分事务状态:
3. 介质故障恢复(数据库物理损坏)
- 步骤:
- 装入最新后备副本(静态转储+日志,或动态转储+完整日志)。
- 装入转储时刻后的日志文件,重做已提交事务。
- 注意:需DBA介入,执行重装和恢复命令。
四、日志文件与恢复策略
(一)日志文件的关键作用
- 事务故障恢复:通过日志回滚未完成事务。
- 系统故障恢复:区分Redo和Undo队列。
- 介质故障恢复:结合后备副本重做已提交事务。
(二)转储与日志结合策略
| 转储方式 | 日志需求 | 恢复效率 |
|---|---|---|
| 静态海量转储 | 仅需转储时刻日志 | 恢复快,需全量数据 |
| 动态增量转储 | 完整记录转储期间所有事务日志 | 恢复需结合日志重做/撤销 |
五、提高数据库可用性的方案
(一)数据库镜像(Database Mirroring)
- 定义:自动将数据库复制到镜像磁盘,主库更新时同步镜像。
- 优点:
- 介质故障时可直接使用镜像磁盘,无需重装。
- 支持并发读操作,提高可用性。
- 缺点:频繁复制影响性能,通常仅镜像关键数据。
六、核心考点总结
- 事务ACID特性:理解各特性的定义及保证机制。
- 故障分类:区分事务内部、系统、介质故障的原因和恢复方式。
- 恢复技术:
- 数据转储的类型及适用场景。
- 日志文件的格式和“先写日志”原则。
- 不同故障的恢复步骤(Redo/Undo的区分与执行)。
- 数据库镜像:作为介质故障的预防措施,提高恢复效率。
复习建议:结合具体案例(如转账事务故障、系统断电、磁盘损坏)理解恢复步骤,重点掌握日志文件在恢复中的核心作用。
第10章 并发控制期末复习总结
一、并发事务执行的问题
(一)三大典型问题
| 问题类型 | 定义 | 示例场景 |
|---|---|---|
| 丢失修改 | 两个事务读入同一数据并修改,后提交的事务覆盖先提交的修改 | T1和T2同时读取A=10,T1改A=9,T2改A=8,最终A=8,T1修改丢失 |
| 不可重复读 | 事务T1读取数据后,T2更新数据,导致T1再次读取结果不一致 | T1读取B=100求和,T2将B改为200,T1重读求和结果变化 |
| 读脏数据 | 事务T1修改数据并写入,T2读取后T1回滚,T2读到的数据与数据库不一致 | T1改C=200,T2读取C=200,T1回滚C=100,T2读到脏数据200 |
(二)问题根源
并发操作破坏了事务的隔离性,需通过并发控制确保事务间互不干扰。
二、封锁机制(核心解决方案)
(一)基本封锁类型
-
排它锁(X锁/写锁)
- 作用:事务T对数据A加X锁后,可读写A,其他事务不能加任何锁,直至T释放。
- 场景:修改数据前必须加X锁,防止其他事务干扰。
-
共享锁(S锁/读锁)
- 作用:事务T对数据A加S锁后,可读A但不能写,其他事务可加S锁但不能加X锁。
- 场景:读取数据时加S锁,允许多个事务同时读,但禁止写。
(二)锁的相容矩阵
| 已有锁\请求锁 | X锁 | S锁 |
|---|---|---|
| X锁 | 不相容 | 不相容 |
| S锁 | 不相容 | 相容 |
三、三级封锁协议(重点考点)
| 协议级别 | 加锁规则 | 解决的问题 |
|---|---|---|
| 一级 | 事务修改数据前加X锁,直至事务结束释放 | 丢失修改 |
| 二级 | 在一级基础上,读取数据前加S锁,读完释放 | 读脏数据 |
| 三级 | 在一级基础上,读取数据前加S锁,直至事务结束释放 | 不可重复读(包括幻影现象) |
示例:
- 二级协议解决读脏数据:T1修改C时加X锁,T2读C时需等T1释放锁,避免读到T1未提交的修改。
四、活锁与死锁
(一)活锁
- 现象:事务因锁请求顺序不当,长期等待无法获得锁(如T2等待T1释放锁,系统优先批准后续T3、T4的请求,T2永远等待)。
- 解决:采用先来先服务(FCFS) 策略,按请求顺序排队。
(二)死锁
- 形成条件:事务T1和T2互相等待对方持有的锁(如T1持R1锁等R2,T2持R2锁等R1)。
- 预防方法:
- 一次封锁法:事务一次申请所有需用的锁,否则不执行(缺点:降低并发度,难预知所有锁)。
- 顺序封锁法:规定数据对象封锁顺序,所有事务按序加锁(缺点:维护成本高,难适应动态变化)。
- 诊断与解除:
- 超时法:等待超过时限则判死锁(可能误判)。
- 等待图法:通过有向图检测回路,发现死锁后撤销代价最小的事务。
五、并发调度的可串行性
(一)可串行化调度
- 定义:并发调度结果与某一串行调度结果相同,即为正确调度。
- 示例:事务T1和T2并发执行结果与T1→T2或T2→T1串行执行结果一致。
(二)两段锁协议(2PL)
- 核心规则:
- 扩展阶段:事务可申请锁,但不能释放锁。
- 收缩阶段:事务可释放锁,但不能申请锁。
- 作用:确保并发调度的可串行性,是可串行化的充分条件(但非必要条件)。
- 注意:遵守2PL的事务可能发生死锁(如T1和T2互相等待锁)。
六、核心考点总结
- 并发问题与协议对应:
- 丢失修改→一级封锁协议;
- 读脏数据→二级封锁协议;
- 不可重复读→三级封锁协议。
- 死锁处理:预防(一次封锁/顺序封锁) vs 诊断(等待图法) vs 解除(撤销事务)。
- 两段锁阶段:扩展阶段申请锁,收缩阶段释放锁,确保调度可串行化。
复习建议:结合具体场景理解各协议的加锁规则,通过案例分析活锁与死锁的形成与解决,重点掌握三级协议的区别和两段锁协议的阶段划分。

1351

被折叠的 条评论
为什么被折叠?



