目录

一、数据库基本概念

1. 核心概念区分

  • 数据 (Data): 描述事物的符号记录,数据库存储的基本对象。
    • 数据与其语义(数据的含义)是不可分的
  • 数据库 (Database, DB): 长期存储在计算机内、有组织的、可共享的大量数据集合
    • 数据按一定的数据模型组织、描述和存储
    • 可为各种用户共享
    • 冗余度较小
    • 数据独立性较高
    • 易扩展
  • 数据库管理系统 (DBMS): 位于用户和操作系统之间的数据管理软件
  • 数据库系统 (DBS): 由DB、DBMS、应用程序、DBA和用户组成的整体

关系链: DBMS 管理 DB,二者都是 DBS 的组成部分

2. 数据管理发展的三个阶段

阶段硬件水平软件水平应用程序与数据的对应关系处理方式特点存在问题
人工管理无直接存取存储设备没有操作系统一个应用程序对应一个数据集批处理管理者是用户,数据不保存
没有专门管理软件
数据面向应用程序
无结构
数据不共享,冗余大不独立,
文件系统磁盘,磁鼓有文件系统应用程序->文件管理系统->文件批处理,联机实时处理管理者是文件系统,数据可长期保存
数据面向应用程序
记录内有结构,整体无结构
共享性差,冗余度大,独立性差,不支持对文件的并发访问
无安全控制功能
数据库系统大容量磁盘,磁盘阵列有数据库管理系统应用程序->DBMS->数据库联机实时处理,分布处理,批处理数据结构化,共享性高,冗余度低,独立性高,统一管理控制

只有人工管理阶段没有专门的软件管理数据

新一代数据库管理系统
分布式数据库,空间数据库,NoSQL数据库,面向对象数据库,信息存储与检索,数据挖掘与数据仓库

3. 数据库系统的主要特点

  • 数据结构化 (主要特征之一,与文件系统的本质区别)
    • 数据的结构用数据模型描述,无需程序定义和解释
    • 数据可以变长
    • 数据的最小存取单位是数据项
  • 数据的共享性高,冗余度低,易扩充
    • 数据面向整个系统
    • 共享好处:
      • 较少数据冗余,节约内存空间
      • 避免数据之间的不相容性与不一致性
      • 使系统易于扩充
  • 数据独立性高 (包括物理独立性和逻辑独立性)
    • 由二级映像功能保证
  • 数据由DBMS统一管理和控制 (安全性检查、完整性检查、并发控制、恢复)

4. DBMS的主要功能

  • 数据定义功能 (DDL)
  • 数据组织、存储和管理
  • 数据操纵功能 (DML)
  • 数据库的事务管理和运行管理
  • 数据库的建立和维护功能

5.数据库系统的组成

最基本组成部分:

  • 数据库
  • 数据库管理系统(核心)
  • 应用系统(硬件及软件环境)
    • 硬件:
      • 要有足够大的内存
      • 要有足够大的硬盘内存
      • 对硬件资源要求很高
    • 软件:
      • DBMS
      • OS
      • 具有数据库访问接口的高级语言及其编程环境
      • 实用工具,一般是数据库厂商提供的

6.数据库系统中包含的人员

  • 数据库管理员(DBA):决定数据库信息内容、决定存储结构和存取策略、定义完整性约束、监控使用和运行、改进和重组
  • 系统分析员:负责应用系统的需求分析和规范说明
  • 数据库设计人员:负责数据库中数据的确定、数据库各级模式的设计
  • 应用程序员:编写应用程序
  • 最终用户:通过应用接口使用数据库

二、数据库系统结构

1. 三级模式结构 (核心!)

一个数据库只有一个模式

模式级别别名描述数量用户
外模式子模式、用户模式数据库用户能看见和使用的局部数据的逻辑结构和特征描述多个最终用户和应用程序员保证数据库安全性
模式逻辑模式数据库中全体数据的逻辑结构和特征的描述一个DBA
内模式存储模式数据在数据库内部的表示方式 (存储方式、索引组织)只有一个系统程序员

2. 两级映像与数据独立性

映像作用保证的独立性
外模式/模式映像每个外模式,数据库系统都有一个外模式/模式映像当模式改变时,DBA修改此映像使外模式保持不变
定义了该外模式与概念模式之间的对应关系
逻辑数据独立性 (应用程序不必修改)
模式/内模式映像映像唯一当内模式改变时,DBA修改此映像使模式保持不变物理数据独立性 (应用程序和模式不必修改)

重要结论: 三级模式 + 两级映像 = 数据独立性

3. 视图 (View)

  • 属于外模式
  • 虚表数据库中只存放视图的定义,不存放视图对应的数据
  • 作用:
    • 使用视图可以简化查询语句的编写
    • 提供一定程度的数据逻辑独立性
    • 对机密数据提供安全保护
  • 视图更新限制:
    • 若视图来自多个基本表,一般不允许更新
    • 若视图包含聚合函数、GROUP BY等,不允许更新
    • 若视图更新违反基本表完整性约束,不允许更新
    • 不一定能加快查询速度,有时可能降低查询效率。

三、关系模型与关系代数

0.数据模型

  • 概念:使对现实世界数据特征的模拟和抽象,用来描述数据是如何组织、存储和操作的
  • 条件:
    • 能比较真实地模拟现实世界
    • 容易为人所理解
    • 便于在计算机上实现
  • 分类
    • 现实世界->概念模型,数据库设计人员完成(第一层抽象)
    • 概念模型->逻辑模型,数据库设计人员完成(第二层抽象)
      • 既面向用户,又面向系统
    • 逻辑模型->物理模型,DBMS完成(具体实现)
  • 组成要素
    • 数据的结构
    • 数据完整性约束条件(比如年龄范围)
    • 数据操作(查询修改等)
维度概念模型逻辑模型物理模型
定义从业务视角对现实世界的数据需求进行高度抽象,描述核心概念及其关系,独立于任何技术实现将概念模型转化为具体的数据结构(如关系型、层次型等),明确定义数据元素、关系及约束,但仍独立于具体DBMS描述数据在特定数据库管理系统(DBMS) 中的具体实现,包括存储结构、索引、分区等物理细节。
主要组件实体、属性、关系(通常用ER图表示,无具体数据类型或键细节)。在关系模型中:表、字段、主键、外键、约束(如唯一、非空)、规范化结构等。表空间、数据文件、索引、视图、存储过程、分区、存储参数(如页面大小、填充因子)等。
抽象级别最高,关注业务概念与语义。中等,关注数据结构与规则。最低,关注物理存储与性能细节。
技术独立性完全独立于DBMS和硬件。独立于具体DBMS,但依赖于所选的数据模型类型(如关系模型、NoSQL模型)。高度依赖于特定DBMS(如Oracle、MySQL、SQL Server)及硬件环境。
关注重点业务需求、数据含义、实体间关系数据结构、数据完整性、减少冗余(如遵循规范化理论)。性能、存储效率、访问速度、安全性、备份恢复等实施细节。
设计阶段需求分析阶段,与用户沟通并达成共识。系统设计模式阶段,将概念模型转化为逻辑结构。数据库实现阶段,在逻辑模型基础上进行物理部署设计。

0.5.关系数据库

  • 概念:建立在关系理论上的数据库,在关系数据库中,实体和实体之间的联系均以关系(表格)的形式进行描述
    • 元组
    • 属性
      • 外码
      • 主码 取值唯一且不能为空,可由一个或多个属性组成,能唯一标识元组。

关系数据库系统采用关系模型作为数据的组织方式

关系操作是面向集合的操作。

0.75关系的性质

  • 列是同质的:每一列中的分量是同一类型的数据,来自同一个域
  • 不同的列可出自同一个域,但需给予不同的属性名
  • 列的顺序无关紧要:列的次序可以任意交换
  • 任意两个元组的候选码不能完全相同
  • 行的顺序无关紧要:行的次序可以任意交换
  • 分量必须取原子值:每一个分量都必须是不可分的数据项

1. 关系数据结构术语

术语关系模型一般表格
关系一张二维表
元组表中的一行记录
码 (键)唯一标识元组的属性(集)关键字
属性的取值范围数据类型

关系中的元组必须互不相同,不能全同。

2. 关系完整性约束 (重点!)

关系完整性约束是为保证数据库中数据的正确性和相容性,对关系模型提出的某种约束条件或规则。

外码注意事项:

  • 外码不一定是本表的主属性
  • 外码可以为空 (除非它也是本表的主属性)
  • 外码的数据类型必须与被参照的主码相同

数据库完整性规则总览

完整性类型核心目的判断方法(如何满足/实现)通俗解释与示例
实体完整性
(您提到的“主体完整性”)
确保表中的每一条记录(实体)都是唯一且可标识的1. 定义主键:为表指定一个主键。
2. 主键约束:主键字段的值必须满足:
– 非空(NOT NULL)
– 唯一(UNIQUE)

示例:学生表(学号(PK), 姓名, …)学号不能为空,且不能重复。
参照完整性
(引用完整性)
确保表与表之间引用关系的一致性,防止出现“孤立记录”或无效引用。1. 定义外键:在从表(子表)中建立指向主表(父表)主键的外键。
2. 外键约束:外键字段的值必须满足以下之一:
– 为空(NULL,如果允许)
– 等于主表中某个已存在的主键值
示例选课表(学号(FK), 课程号(FK), 成绩)。其中的学号必须在学生表中存在,课程号必须在课程表中存在。
域完整性确保表中每个字段(列)的值都符合其定义的数据类型、格式和有效范围1. 选择合适的数据类型:如整数(INT)、字符(VARCHAR)、日期(DATE)。
2. 使用约束
– 非空(NOT NULL)
– 检查约束(CHECK)
– 默认值(DEFAULT)
– 数据类型自带的格式(如日期格式)
比如“年龄”字段只能填数字,“性别”字段只能填‘男’或‘女’。
示例员工表(性别 CHAR(2) CHECK (性别 IN (‘男’, ‘女’)), 年龄 INT CHECK (年龄 >= 18))
用户自定义完整性根据具体业务需求制定的特殊规则,是上述三种完整性无法覆盖的。1. 业务逻辑检查:在应用程序代码中实现。
2. 数据库高级对象:使用触发器存储过程或复杂的检查约束来实现。
示例1订单表的“发货日期”必须晚于“下单日期”。(可用CHECK约束)
示例2:VIP客户的订单金额必须超过1000元。(可能需要触发器判断客户等级和金额)

3. 关系代数运算

(1) 传统集合运算 (要求关系R和S具有相同的目,对应属性取自同一个域)

  • 并 (R∪S): 所有属于R或属于S的元组
  • 差 (R-S): 所有属于R但不属于S的元组
  • 交 (R∩S): 既属于R又属于S的元组
  • 笛卡尔积 (R×S): R的每个元组与S的每个元组连接

(2) 专门的关系运算

运算符号说明SQL对应
选择σ从关系中选择满足条件的元组WHERE
投影π从关系中选择若干属性列SELECT
连接从两个关系的笛卡尔积中选取满足条件的元组JOIN

连接类型:

  • 等值连接: 连接条件为相等比较
  • 自然连接: 特殊的等值连接,自动比较所有同名属性,并去掉重复列
  • 外连接: 保留悬浮元组 (左外、右外、全外)

重要考点: 自然连接的两个关系必须有同名属性

4. 函数依赖与范式

  • 概念
    • 设X.Y是关系R的两个属性集合,当任何时刻R中的任意两个元组中的X属性值相同时,则它们的Y属性值也相同,则称X函数决定Y,或Y函数依赖于X,记为X一Y

(1) 函数依赖类型

  • 完全函数依赖: 如果X→Y,且对于X的任何真子集X’,都不满足X’→Y
  • 部分函数依赖: 如果X→Y,但Y不完全依赖于X,即存在X的真子集X’满足X’→Y
  • 传递函数依赖: 如果X→Y,Y→Z,且Y⊈X,Z⊈Y,则Z传递依赖于X
  • 平凡函数依赖:当关系中属性集合Y属性集合X的子集时(Y<X),存在函数依赖X→Y即一组属性函数决定它的所有子集,
  • 非平凡函数依赖:当关系中属性集合Y不是属性集合X的子集时,存在函数依赖X→Y,

(2) 规范化范式 (重点!)

范式要求解决的问题问题
1NF属性不可再分 (原子性)最基本要求存在插入异常、删除异常、数据冗余度大、修改复杂
2NF在1NF基础上,消除非主属性对码的部分函数依赖部分依赖导致的异常
3NF在2NF基础上,消除非主属性对码的传递函数依赖传递依赖导致的异常
BCNF在3NF基础上,消除主属性对码的部分和传递函数依赖更严格的3NF

范式判断流程:

  1. 找出所有候选码
  2. 确定主属性和非主属性
  3. 检查是否存在部分依赖 (判断2NF)
  4. 检查是否存在传递依赖 (判断3NF)

范式与异常关系:

  • 1NF: 可能存在插入、删除、更新异常
  • 2NF: 消除了部分依赖,但仍可能有传递依赖导致的异常
  • 3NF: 消除了传递依赖,但仍可能存在少量异常
  • 3NF不一定消除所有插入和删除异常

四、SQL语言

0.特点

  • 综合统一
  • 高度非过程化
  • 面向集合的操作方式
  • 语言简捷,易学易用
  • 以同一种语法结构提供两种使用方式:独立和嵌入

0.5.数据类型

  • 数值类型
    • 准确型:指在计算机中能够精确存储的数据
    • 近似型:指近似的数值数据类型
  • 文本类型
    • 普通字符编码
    • Unicode字符编码
  • 日期时间类型
  • 二进制类型

1. 数据定义语言 (DDL)

-- 创建表
CREATE TABLE Student (
    s_id CHAR(10) PRIMARY KEY,
    sname VARCHAR(20) NOT NULL,
    sex CHAR(2),
    birthday DATE,
    sdepartment VARCHAR(30)
);

-- 创建带外键的表
CREATE TABLE Grade (
    s_id CHAR(10),
    c_id INT,
    grade INT CHECK(grade BETWEEN 0 AND 100),
    PRIMARY KEY(s_id, c_id),
    FOREIGN KEY(s_id) REFERENCES Student(s_id),
    FOREIGN KEY(c_id) REFERENCES Course(c_id)
);

重要约束:

约束类型关键字主要作用是否允许NULL是否允许多个
主键约束PRIMARY KEY
(唯一且非空)
唯一标识表中的每一行,确保实体完整性不允许每表一个
外键约束FOREIGN KEY确保引用完整性,限制只能引用另一个表中存在的值允许(除非外码也是主属性)每表多个
唯一约束UNIQUE确保列中的所有值都不同(唯一性)允许(多个NULL)每表多个
检查约束CHECK限制列中值的取值范围,确保域完整性允许(除非同时有NOT NULL)每列多个
默认约束DEFAULT当插入行未指定列值时,使用默认值允许(本身就是处理NULL)每列一个
非空约束NOT NULL确保列不能包含NULL值不允许-(属性级别)

2. 数据查询语言 (DQL)

(1) 基本查询

-- 选择所有列
SELECT * FROM Student;

-- 选择特定列
SELECT s_id, sname FROM Student;

-- 去重
SELECT DISTINCT sdepartment FROM Student;

-- 使用别名/友好列标题
SELECT sname AS 姓名, sdepartment AS 院系 FROM Student;

-- Top关键字 只显示前n条数据
Select Top 3 * from Student

(2) 条件查询

-- WHERE 条件
SELECT * FROM Student WHERE sdepartment = '信息工程学院';

-- LIKE 模糊查询
SELECT * FROM Student WHERE sname LIKE '张%';  -- 姓张
SELECT * FROM Student WHERE sname=='_小%' or sname=='_大'; -- 第二个字为"小"或‘大’

-- NULL 判断
SELECT * FROM Student WHERE bonus IS NULL;
SELECT * FROM Student WHERE bonus IS NOT NULL;

-- And/Or
Select * from Student  where Ssex-='' and Sage>21

-- Between and//Not Between and 使用同理
Select Sno.Sname,Ssex from Student wherre Sno between 'J2016001' and 'J2016004'-- 要比较的值是介于某个范围而且包含边界值

-- In关键字
Select * from Teacher where Tport in('教授','副教授')

-- DISTINCT表示检索时显示不重复的信息
Select DISTINCT TPort from Teacher

-- IS NULL//IS NOT NULL
Select * from spt_values where low IS NULL-- 执行此语句需要先转到Master数据库

-- Order by排序,可以使用逗号隔开多个列
Select * from Course Order by Cname Desc

-- 算术表达式
Select 3*5,SQRT(2)-- 3*5的结果以及根号2的值

(3) 聚合函数与分组

COUNT()返回匹配指定条件的行数

COUNT(*)返回表中的记录数

COUNT(column_name)返回指定列的值的数目(NULL不计入)

-- 常用聚合函数
SELECT COUNT(*) FROM Student;  -- 计数
SELECT AVG(grade) FROM Grade;  -- 平均值
SELECT MAX(grade), MIN(grade) FROM Grade; -- 最大最小值
SELECT SUM(ccredit) FROM Course; -- 求和

-- GROUP BY 分组
SELECT sdepartment, COUNT(*) FROM Student GROUP BY sdepartment;-- 统计学生表中各系的学生人数

-- HAVING 分组后筛选
SELECT sdepartment, COUNT(*) 
FROM Student 
GROUP BY sdepartment 
HAVING COUNT(*) > 10;

(4) 多表查询:连接查询

  • 分类
    • 内连接(最典型 最常用,存在主外键关系)
    • 外连接
      • 左连接
      • 右连接
      • 完全外连接 full join 或 full outer join
    • 交叉连接
-- 内连接 (显式)
SELECT Student.s_id, sname, cname, grade
FROM Student 
INNER JOIN Grade ON Student.s_id = Grade.s_id
INNER JOIN Course ON Grade.c_id = Course.c_id;

-- 内连接 (隐式)
SELECT Student.s_id, sname, cname, grade
FROM Student, Grade, Course
WHERE Student.s_id = Grade.s_id 
  AND Grade.c_id = Course.c_id;

-- 左外连接
SELECT Student.s_id, sname, grade
FROM Student 
LEFT JOIN Grade ON Student.s_id = Grade.s_id;

-- 右外连接
SELECT Course.c_id, cname, grade
FROM Grade 
RIGHT JOIN Course ON Grade.c_id = Course.c_id;

-- 交叉连接
Select * from 
Student CROSSn JOIN Course

(5) 子查询(qian)

-- IN /Not In子查询(结果是包含零个值或多个值的列表)
SELECT sname FROM Student 
WHERE s_id IN (SELECT s_id FROM Grade WHERE grade > 90);

-- EXISTS 子查询(是否存在 结果是TRUE或FALSE)
SELECT cname FROM Course 
WHERE EXISTS (SELECT * FROM Grade WHERE Grade.c_id = Course.c_id);

-- 比较子查询(ANY)
SELECT sname, grade FROM Grade 
WHERE grade >= (SELECT AVG(grade) FROM Grade WHERE c_id = 1) 
  AND c_id = 1;
  
  
-- ALL
Select * from Teacher
Where Tsex =''and
Tage > ALL(Select Tage from Teacher where Tsex='')--检索比任何一个女教师年龄都大的男教师

(6) 集合查询

SELECT语句必须拥有相同数量的列

-- UNION 并集 (自动去重)
SELECT s_id FROM Student WHERE sex = ''
UNION
SELECT s_id FROM Grade WHERE grade > 90;

-- UNION ALL 并集 (不去重)
SELECT s_id FROM Student WHERE sex = ''
UNION ALL
SELECT s_id FROM Grade WHERE grade > 90;

-- 交运算
Select Sno,Sname,Sage,Smajor from Student
where Smajor like'计算机%'
Intersect
Select Sno,Sname,Sage,Smajor from Student
Where Sage=21

-- 差运算
Select Sno,Sname,Sage,Smajor from Student
where Smajor like'计算机%'
Except
Select Sno,Sname,Sage,Smajor from Student
Where Sage=21

3. 数据操纵语言 (DML)

-- 插入数据
INSERT INTO Student VALUES ('2023001', '张三', '', '2000-01-01', '计算机学院');

-- 插入部分数据
INSERT INTO Student(s_id, sname, sex) VALUES ('2023002', '李四', '');

-- 更新数据
UPDATE Course SET chours = chours - 8 WHERE cname = '数据结构';

-- 删除数据
DELETE FROM Student WHERE s_id = '2023001';

-- 删除表约束
ALTER TABLE Student DROP CONSTRAINT CK_Stu_Age;

4. 视图

  • 优点
    • 视图隐藏了底层的表结构,简化了数据访问操作
    • 因为隐藏了底层的表结构,所以大大加强了安全性,用户只能看到视图提供的数据。
    • 使用视图,方便了权限管理,让用户对视图有权限而不是对底层表有权限进一步加强了安全性。
    • 视图提供了一个用户访问的接口,当底层表改变后,改变视图的语句来进行适应,使已经建立在这个视图上客户端程序不受影响。
-- 创建视图
CREATE VIEW V_CS_Students AS
SELECT * FROM Student WHERE sdepartment = '计算机科学学院';

-- 使用视图
SELECT * FROM V_CS_Students;

-- 删除视图
DROP VIEW V_CS_Students;

5. 索引

  • 分类
    • 主键索引
    • 唯一索引
    • 聚集索引
    • 非聚集索引
-- 创建索引
CREATE INDEX idx_sname ON Student(sname);

-- 创建唯一索引
CREATE UNIQUE INDEX idx_email ON Student(email);

-- 删除索引
DROP INDEX idx_sname ON Student;

索引注意事项:

  • 提高查询速度,但降低更新速度
  • 一个表只能有一个聚集索引
  • 经常在WHERE、JOIN、ORDER BY中使用的列适合建索引
  • 更新频繁的表不宜建太多索引

6. 存储过程

-- 创建存储过程
CREATE PROCEDURE prcFindByName
    @name VARCHAR(20),
    @total_credit INT OUTPUT
AS
BEGIN
    SELECT @total_credit = SUM(ccredit)
    FROM Student s
    JOIN Grade g ON s.s_id = g.s_id
    JOIN Course c ON g.c_id = c.c_id
    WHERE s.sname = @name
    GROUP BY s.s_id;
END;

-- 执行存储过程
DECLARE @credit INT;
EXEC prcFindByName '张三', @credit OUTPUT;
PRINT @credit;

7. 权限控制

-- 授予权限
GRANT SELECT, UPDATE ON Student TO user1;

-- 授予所有权限
GRANT ALL PRIVILEGES ON Student TO user1;

-- 收回权限
REVOKE UPDATE ON Student FROM user1;

-- 拒绝权限
DENY DELETE ON Student TO user1;

权限控制三步:

  1. 创建登录名: CREATE LOGIN login1 WITH PASSWORD = '123456'
  2. 创建数据库用户: CREATE USER user1 FOR LOGIN login1
  3. 授予权限: GRANT SELECT ON Student TO user1

五、数据库设计

1. E-R模型

(1) E-R图基本元素

元素表示说明
实体矩形客观存在并可相互区别的事物
属性椭圆实体所具有的某一特性
联系菱形实体之间或实体内部的关系

(2) 联系类型

  • 1:1 (一对一): 如班长-班级
  • 1:n (一对多): 如班级-学生
  • m:n (多对多): 如学生-课程

(3) E-R图合并冲突

  • 属性冲突: 同一属性在不同E-R图中类型、取值范围不同
  • 命名冲突: 同名异义或异名同义
  • 结构冲突: 同一对象在不同E-R图中抽象不同 (如一个作为实体,一个作为属性)

2. E-R图向关系模型的转换规则

情况转换规则
一个实体型转换为一个关系模式,属性→关系的属性,码→关系的码
1:1联系可以转换为独立关系,也可以与任意一端实体合并
1:n联系可以转换为独立关系,也可以与n端实体合并
m:n联系必须转换为独立的关系模式,两端实体的码作为关系的组合码
三个及以上实体间的多元联系转换为独立的关系模式,各实体的码组成关系的码或作为外码

重要考点: m:n联系必须单独转换为一个关系模式

3. 规范化设计实例

原关系模式: Student(学号, 姓名, 年龄, 所在学院, 学院地点, 学院电话)

函数依赖:

  • 学号 → 姓名, 年龄, 所在学院
  • 所在学院 → 学院地点, 学院电话

问题: 存在传递依赖 (学号 → 所在学院 → 学院地点)

规范化到3NF:

  1. 学生(学号, 姓名, 年龄, 所在学院)
  2. 学院(学院, 地点, 电话)

六、事务与并发控制

1. 事务的特性 (ACID)

1)恢复和并发控制的基本单位

特性描述
原子性事务中的操作要么都做,要么都不做
一致性事务执行的结果必须使数据库从一个一致性状态变到另一个一致性状态
隔离性一个事务的执行不能被其他事务干扰
持久性事务一旦提交,对数据库的改变就是永久的

2)事务的两种方式

事务的方式事务处理模型特点
显式事务ISO事务处理模型明尾暗头
T-SQL事务处理模型明头明尾
隐式事务

3)事务的特征

  • 重要任务:保证事务的ACID特性
  • ACID被破坏的可能原因
    • 多个事务并行运行时,不同事务的操作有交叉情况(并发控制)
    • 事务在运行过程中被迫停止(数据恢复)

2. 并发操作

2.1可能带来的问题

问题描述示例
丢失修改两个事务同时修改同一数据,后提交的覆盖了先提交的T1和T2都读A=10,T1写A=5,T2写A=2,最后A=2
不可重复读事务两次读取同一数据,结果不同T1读A=10,T2修改A=20并提交,T1再读A=20
读脏数据读取了未提交的数据,然后该事务被回滚T1修改A=20(未提交),T2读A=20,T1回滚,A恢复为10

3. 封锁机制

(1) 锁的类型

  • 共享锁 (S锁/读锁): 事务T对数据对象A加S锁,可以读A但不能修改A
  • 排他锁 (X锁/写锁): 事务T对数据对象A加X锁,可以读和修改A

锁的相容矩阵:

请求\现有S锁X锁无锁
S锁×
X锁××

(2) 封锁协议

协议级别内容解决的问题
一级封锁协议事务在修改数据前必须加X锁,直到事务结束释放丢失修改
二级封锁协议在一级基础上,读取数据前必须加S锁,读完后立即释放丢失修改 + 读脏数据
三级封锁协议在一级基础上,读取数据前必须加S锁,直到事务结束释放丢失修改 + 读脏数据 + 不可重复读

(3) 两段锁协议 (2PL)

  • 扩展阶段: 只能获得锁,不能释放锁
  • 收缩阶段: 只能释放锁,不能获得锁

重要结论: 遵守两段锁协议的事务是可串行化的,但可能死锁

(4) 死锁处理

  • 预防: 一次封锁法、顺序封锁法
  • 诊断: 超时法、等待图法
  • 解除: 选择代价最小的事务回滚

七、数据库备份与恢复

1. 故障类型

  • 事务内部故障
    • 可以预期的事务故障
    • 非预期1的事务故障
  • 系统故障
  • 介质故障 (最严重)
  • 计算机病毒

2. 备份类型

备份类型描述优点缺点
完全备份备份整个数据库恢复简单备份时间长,占用空间大
差异备份备份自上次完全备份以来变化的数据备份时间较短恢复需要完全备份+最后一次差异备份
事务日志备份备份事务日志备份时间短,可恢复到任意时间点恢复过程复杂

3.转储

  • 方法
转储方法描述优点缺点
静态转储在转储期间,系统停止运行应用程序,不允许对数据库进行任何存取、修改操作实现简单
降低了数据库的可用性
转储必须等用户事务结束
新的事务必须等转储结束
动态转储转储期间允许应用程序继续运行,可对数据库进行存取、修改操作不用等待正在运行的用户事务结束
不会影响新事务的运行
不能保证副本中的数据正确有效
海量转储每次转储全部数据库数据1. 恢复过程简单直接
2. 恢复时间较短(相对于增量恢复)
3. 管理简单
1. 存储空间需求大
2. 转储时间长
3. 网络带宽占用大
增量转储只转储上一次转储后更新过的数据1. 存储空间需求小
2. 转储时间短
3. 网络带宽占用少
1. 恢复过程复杂
2. 恢复时间长(需按顺序恢复)
3. 管理复杂

4. 恢复策略

恢复顺序必须严格遵守:

  1. 恢复最近的完全备份
  2. 恢复该完全备份之后最近的差异备份 (如果有)
  3. 按时间顺序恢复自完全备份或差异备份之后的所有事务日志备份

示例恢复过程:

完全备份1 (1月1日)
差异备份1 (1月2日)
日志备份1 (1月3日)
差异备份2 (1月4日)
日志备份2 (1月5日)
日志备份3 (1月6日)

1月7日发生故障,恢复顺序: 完全备份1 → 差异备份2 → 日志备份2 → 日志备份3

5. 日志文件

  • 作用: 记录事务对数据库的所有更新操作
  • 用途
    • 事务故障的恢复
    • 系统故障的恢复
    • 介质故障的恢复
  • 登记原则:
    1. 登记的次序严格按照事务执行的时间次序
    2. 先写日志文件,后写数据库 (WAL原则 保证数据库是可恢复的)

八、NoSQL数据库

1. NoSQL概念

  • 非关系型数据库,不保证ACID特性
  • 适用于大规模数据存储和高并发访问
  • 数据模型灵活,易于扩展

2. NoSQL分类

类型数据模型典型产品适用场景
键值存储Key-Value对Redis, Memcached缓存、会话存储
文档型类似JSON的文档MongoDB, CouchDB内容管理、用户配置
列存储按列存储数据HBase, Cassandra大数据分析、日志处理
图形数据库图结构Neo4j社交网络、推荐系统

重要考点: 关系数据库不是NoSQL类型

3. NoSQL适用场景

  • 需要灵活性更强的IT系统
  • 数据模型比较简单
  • 对数据库性能要求更高
  • 不需要高度的数据一致性
  • 海量数据的存储和处理

九、SQL Server 特有关注点

1. SQL Server 系统数据库

数据库作用
master记录所有系统级信息
model模板数据库,新建数据库的模板
msdb代理服务使用,存储作业、警报等信息
tempdb临时数据库,存储临时对象

2. T-SQL 特殊语法

-- TOP 限制返回行数
SELECT TOP 5 * FROM Student ORDER BY birthday DESC;

-- 局部变量声明
DECLARE @name VARCHAR(20);
SET @name = '张三';
SELECT * FROM Student WHERE sname = @name;

-- 全局变量
SELECT @@VERSION;  -- SQL Server版本
SELECT @@ROWCOUNT; -- 受影响的行数

3. 触发器

-- 创建触发器
CREATE TRIGGER tr_UpdateProduct
ON Orders
AFTER INSERT
AS
BEGIN
    UPDATE Products 
    SET iQuantityOnHand = iQuantityOnHand - inserted.Quantity
    FROM inserted
    WHERE Products.ProductID = inserted.ProductID;
END;

触发器类型:

INSTEAD OF 触发器: 代替操作执行

AFTER 触发器: 在操作执行后触发

分类: 未分类