数据库系统概论

谨编写该 Markdown 来整理一下知识点并把书上一些语言翻译成人类语言[滑稽]

绪论

概述

基本概念

  • 数据:数据库中存储的基本对象,描述失误的符号记录,其含义为语义
  • DB(数据库):长期存储在计算机内、有组织、可共享的大量数据的集合
  • DBMS(数据库管理系统):计算机基础软件,具有
    • 数据定义功能(使用DDL)
    • 数据组织存储和管理
    • 数据操纵功能
    • 数据库事务管理、运行管理
    • 数据库建立与维护
  • DBS(数据库系统):DBMS+DB+APP+DBA组成存储管理处理维护数据的系统

发展阶段

  1. 人工管理 -20ce50ys
  2. 文件系统阶段 20ce50ys-20ce60ys
    • 长期保存
    • 文件系统管理
    • 共享度差、冗余度大
    • 独立性差
  3. 数据库系统阶段 20ce60ys-
    • 数据管理技术的飞跃

数据库系统特点

  • 数据整体结构化,具有内在联系(与文件系统本质区别)
  • 数据共享性高、冗余度低、易扩充
  • 数据独立性高
    • 物理独立性:物理存储<->用户应用
    • 逻辑独立性:数据库逻辑<->用户应用
  • 由DBMS统一管控
    • 数据安全:访问权限控制
    • 数据完整性:数据正确性、有效性
    • 并发控制
    • 数据库恢复

数据模型

数据模型:对现实世界数据特征的抽象

两类数据模型

  • 概念模型:用于数据库设计
  • 逻辑模型与物理模型
    • 层次、网状、关系、面向对象、对象关系、半结构化
    • 底层数据抽象,系统层面

现实世界 ⇔ \Leftrightarrow 信息世界 ⇔ \Leftrightarrow 机器世界

概念模型

具体内容参见 数据库设计

  • 用于信息世界建模
  • 现实到信息世界第一层抽象
  • 数据库设计人员设计的有力工具
  • 数据库设计人员与用户之间的交流语言
英文 名称 内涵
Entity 实体 客观存在并可相互区别的事物
Attribute 属性 实体所具有的某一特征
Key 实体唯一标识符
Entity Set 实体集 同类型实体合集
Relationship 联系 实体间的联系(1-1、1-n、m-n)

数据模型组成要素

  • 数据结构:对象+对象联系(DDL)
  • 数据操作:对数据库对象允许的操作集(增删改)
  • 数据完整性约束:基于现实和关系的数据内容限制(两种约束)

常用模型

  • 层次模型:IMS
  • 网状模型:DBTG(CODASYL)
  • 关系模型:数据规范化(范式)

数据库系统结构

三级模式,两层映像

  • 外模式:用户模式(视图)

    ⇕ \Updownarrow 外模式/模式映像:逻辑独立性,模式改变,外部程序不变

  • 模式:逻辑模式(数据库定义)

    ⇕ \Updownarrow 模式/内模式映像:物理独立性,存储结构修改,模式不变

  • 内模式:存储模式(内在数据管理与组织)

关系数据库

关系数据结构与形式化定义

名称 定义
D i D_i Di 相同类型的数据集合
笛卡尔积 D 1 × D 2 … × D n D_1\times D_2\ldots\times D_n D1×D2×Dn
基数 m i m_i mi 域可取值的总数
候选码 可唯一表示对象的最小属性组
关系 R ( D 1 , D 2 , D 3 , … , D n ) R(D_1,D_2,D_3,\ldots,D_n) R(D1,D2,D3,,Dn)
关系模式 R ( U , D , D O M , [ F ] ) R(U,D,DOM,[F]) R(U,D,DOM,[F])

关系操作

基本操作:

  • 查询,插入,删除,更新

操作语言:

  • SQL

    • 注:使用不同数据库时语言有差异,因此查询语句有可能不通用
    • 例如:
      OracleDB可以进行一些集合操作
      SQL Server的数据库定义功能和身份认证比较丰富
      MySQL不具备事务相关的功能
  • DCL

关系代数

用对关系的运算来表达查询

1. 传统集合运算

名称 英文 运算
Union R ∪ S = { t ∣ t ∈ R ∨ t ∈ S } R\cup S= \{t\mid t\in R\vee t\in S\} RS={ttRtS}
Except R − S = { t ∣ t ∈ R ∧ t ∉ S } R-S= \{t\mid t\in R\wedge t\notin S\} RS={ttRt/S}
Intersection R ∩ S = { t ∣ t ∈ R ∧ t ∈ S } R\cap S= \{t\mid t\in R\wedge t\in S\} RS={ttRtS}
笛卡尔积 Cartesian Product R × S = { t r t s ^ ∣ t r ∈ R ∧ t s ∈ S } R\times S= \{\hat{t_rt_s}\mid t_r\in R\wedge t_s\in S\} R×S={trts^trRtsS}

2. 传统集合运算

名称 英文 运算
选择 Selection σ F ( R ) = { t ∣ t ∈ R ∧ F ( t ) = t r u e } \sigma_F(R)= \{t\mid t\in R\wedge F(t)=true\} σF(R)={ttRF(t)=true}
投影 Projection Π A ( R ) = { t [ A ] ∣ t ∈ R } \Pi_A(R)= \{t[A]\mid t\in R\} ΠA(R)={t[A]tR}
连接 Join R ⋈ A θ B S = { t r t s ^ ∣ t r ∈ R ∧ t s ∈ S ∧ t r [ A ] θ t s [ B ] } R\underset{A\theta B}\Join S= \{\hat{t_rt_s}\mid t_r\in R\wedge t_s\in S\wedge t_r[A]\theta t_s[B]\} RAθBS={trts^trRtsStr[A]θts[B]}
*自然连接 Natrual Join R ⋈ S = { t r t s ^ [ U − B ] ∣ t r ∈ R ∧ t s ∈ S ∧ t r [ A ] = t s [ B ] } R\Join S= \{\hat{t_rt_s}[U-B]\mid t_r\in R\wedge t_s\in S\wedge t_r[A]= t_s[B]\} RS={trts^[UB]trRtsStr[A]=ts[B]}
Division R ÷ S = { t r [ X ] ∣ t r ∈ R ∧ Π Y ( S ) ⊆ Y x } , Y x 为 x 在 R 中 的 象 集 , x = t r [ X ] R\div S= \{t_r[X]\mid t_r\in R \wedge\Pi_Y(S)\subseteq Y_x\}, Y_x为x在R中的象集,x=t_r[X] R÷S={tr[X]trRΠY(S)Yx},YxxRx=tr[X]
  • 连接中存在外连接的操作
    • 左外连接 保留左关系中所有悬浮组
    • 右外连接 保留右关系中所有悬浮组
    • 外连接 保留双侧关系中所有悬浮组
  • R ÷ S = T R\div S=T R÷S=T,则 T T T包含在 R R R中但不在 S S S中的属性与值,且 T T T中仅存在 R R R S S S中,在公共属性处值相同的元组的项。

下面简述一下它和SQL语句的对应关系:

  • SQL
SELECT student.s_id, student.s_name FROM student, student_course
WHERE student.s_id = student_course.sc_s_id AND student_course.sc_score < 60;
  • 对应关系代数

Π s _ i d , s _ n a m e ( s t u d e n t ⋈ σ c _ s c o r e < 60 ( s t u d e n t _ c o u r s e ) ) \Pi_{s\_id, s\_name}(student \Join \sigma_{c\_score\lt60}(student\_course)) Πs_id,s_name(studentσc_score<60(student_course))

  • 对应元组关系演算
    (这里设s_id s_name 分别为student的第1、2个属性,s_id sc_score分别为student_course的第1、3个属性)

= { t ( 2 ) ∣ ( ∃ s ) ( ∃ s c ) ∧ s t u d e n t ( s ) ∧ s t u d e n t _ c o u r s e ( s c ) ∧ t [ 1 ] = s [ 1 ] ∧ t [ 2 ] = s [ 2 ] ∧ s [ 1 ] = s c [ 1 ] ∧ s c [ 3 ] < 60 } = \{ t^{(2)}\mid (\exist s)(\exist sc)\wedge student(s) \wedge student\_course(sc)\wedge t[1]=s[1]\wedge t[2]=s[2]\wedge s[1]=sc[1]\wedge sc[3]<60\} ={t(2)(s)(sc)student(s)student_course(sc)t[1]=s[1]t[2]=s[2]s[1]=sc[1]sc[3]<60}

SQL

数据定义

创建数据库:

-- 通用
CREATE DATABASE db_name;

-- SQL Server
CREATE DATABASE db_name
ON PRIMARY (
   name = db_data_name,
   filename = N'fs_db_path',
   size = fs_size,
   filegrowth = growth_percent
)
LOG ON (
   name = db_log_name,
   filename = N'fs_log_path'
);

创建表(通用):

  • 基本语法
CREATE TABLE table_name (
    attr_name attr_type [col_restrict],
    ...
    [table_restrict]
);
  • 数据类型(常用)
基础类型 数据类型 含义
字符串 CHAR(n) n个定长字符
- VARCHAR(n) n个变长字符
数值 INTEGER 4bytes 整型
- SMALLINT 2bytes 整型
- BIGINT 8bytes 整型
- MONEY 8bytes 2位小数
- BOOLEAN, BIT 1bytes
日期时间 DATETIME yyyy-mm-dd HH:MM:SS
- TIME HH:MM:SS
- DATE yyyy-mm-dd
  • 注:所有字符串类型都应该用单引号扩入
  • 例:以下语句将学生选课的关系结构化
-- 对象表(学生)
CREATE TABLE student (
   s_id CHAR(12),
   s_dept_id INTEGER,
   s_name CHAR(20),
   s_sex CHAR(2),
   PRIMARY KEY(s_id),
   FOREIGN KEY(s_dept_id) REFERENCES department(d_id)
);

--对象表(课程)
CREATE TABLE course (
   c_id CHAR(4),
   c_name CHAR(40) NOT NULL,
   c_pno CHAR(4),
   PRIMARY KEY(c_id),
   FOREIGN KEY(c_pid) REFERENCES course(c_id)
);

--参照表(学生课程)
CREATE TABLE student_course (
   sc_s_id CHAR(12),
   sc_c_id CHAR(4),
   sc_score INTEGER,
   PRIMARY KEY(sc_s_id, sc_c_id),
   FOREIGN KEY(sc_s_id) REFERENCES student(s_id),
   FOREIGN KEY(sc_c_id) REFERENCES course(c_id)
);

创建模式:

CREATE SCHEMA schema_name AUTHORIZATION user_name
CREATE TABLE ... ();

修改表:

ALTER TABLE table_name
[ADD COLUMN col_name col_type [col_restrict]]
[ADD [table_restrict]]
[DROP COLUMN col_name [RESTRICT|CASCADE]]
[DROP [table_restrict]];

删除表:

DROP TABLE table_name [RESTRICT|CASCADE];
  • RESTRICT 将检查依赖,违反则不予执行
  • CASCADE 将删除所有依赖列/表
  • SQL Server 不支持R/C选项,执行 DROP 时按照 RESTRICT 准则进行

建立索引:

CREATE [UNIQUE|CLUSTERED] INDEX index_name 
ON table_name(col_name_1 [ASC|DESC],...);

删除索引:

DROP TABLE index_name;

数据查询

基本查询

SELECT [ALL|DISTINCT] des_row,...
FROM table_or_view_name,[table_or_view_name_2,...]|
AS custom_name
WHERE condition
[GROUP BY col_name [HAVING condition_gp]]
[ORDER BY col_name [ASC|DESC]]; 
  • 默认查询缺省为 ALL

条件表达式:

条件 谓词
逻辑运算符 AND OR NOT
比较运算符 = > <
元组 IN (tuple or subselect)
范围 BETWEEN up AND down
字符正则 LIKE 'REGEXP'
空值判定 IS NULL
  • 可用 ESCAPE 来转义不翻译的字符的标示符
    • LIKE 'WQL\_YQML' ESCAPE '\'

聚集函数:

函数名 功能
COUNT(*|[DISTINCT|ALL] col_name) 对列计数
SUM([DISTINCT|ALL] col_name) 求和
AVG([DISTINCT|ALL] col_name) 均值
MAX([DISTINCT|ALL] col_name) 最大值
MIN([DISTINCT|ALL] col_name) 最小值
  • COUNT(*) 均自动跳过空值
  • 聚集函数可以使用在 SELECT 中进行查询
  • 聚集函数可以使用在 HAVING 子句中,做为分组的筛选条件

连接查询

从多张表中 SELECT 列,然后从整体运算的笛卡尔积中使用条件表达式找出符合要求的元组
连接查询的笛卡尔积运算量很大,是一种很智障但写起来很简单的查询方式

  • 等值/非等值连接
SELECT student.s_id FROM student, student_course
WHERE student.s_id = student_course.sc_s_id
  • 自身连接:与自己进行连接,需要制定别名
SELECT FIRST.c_id. SECOND.c_pid FROM course FIRST, course SECOND
WHERE FIRST.c_pid = SECOND.c_id;
  • 外连接:将悬浮组(没有匹配到结果的部分)保留
SELECT student.*
FROM course LEFT OUTER JOIN student_course
ON student.s_id = student_course.sc_s_id;
  • 多表
SELECT student.*, course.* FROM student, student_course, course
WHERE student.s_id = student_course.sc_s_id AND 
      course.c_id = student_course.sc_c_id

嵌套查询

多个 SELECT-FROM-WHERE 查询块叠加

SELECT s_name FROM student
WHERE student.s_id IN 
    (SELECT sc_s_id FROM student_course 
    WHERE sc_c_id = 
        (SELECT c_id FROM course 
        WHERE c_name = '坤学')
    );
  • 子查询不可 ORDER BY
  • 子查询前的谓词还可使用 [comparation_opetator][ANY|ALL] 来进行筛选
  • 相关/不相关子查询,指子查询与父查询有无关联(同一张表,同一个属性列)

使用 EXISTS 来判定候选组是否存在

SELECT s_name FROM student
WHERE EXISTS
    (SELECT * FROM student_course 
    WHERE c_id = 
        (SELECT c_id FROM course 
        WHERE c_name = '坤学') AND
        student.s_id = student_course.sc_s_id
    );

集合查询

(SELECT * FROM ... WHERE ...)
[UNION|INTERSECT|EXCEPT]
-- 并,交,差
(SELECT * FROM ... WHERE ...)

数据更新

插入数据

-- 直接插值
INSERT INTO table_name(col_name_1, col_name_2, ...)
VALUES(value_1, value_2, ...);

-- 插入查询结果
INSERT INTO table_name(col_name_1, col_name_2, ...)
(SELECT ... FROM ... WHERE ...);

修改数据

UPDATE table_name
SET col_name_1 = expression_1, 
    col_name_2 = expression_2, ...
WHERE conditions;

删除数据

DELETE FROM table_name
WHERE conditions;

视图

对应外模式映像,本质为一段查询,为虚表,实时查询实时调用,其数据结果不储存

CREATE VIEW view_name(col_name_1, col_name_2) AS
(SELECT ... FROM ... WHERE)
  • 其全部查询规则遵循 数据查询 中的描述

数据库安全

避免非授权访问、恶意更改

授权控制

  • 定义用户权限
    • 用户权限登记到数据词典中
  • 合法权限检查
    • 是否有权限对特定 对象 进行特定 操作
  • 二者一起组成了数据库管理系统的权限控制子系统

授权与驳回

-- 赋予权限
GRANT privilege_name
ON object_type object_name
TO user_name
WITH GRANT OPTION;
object_type privilege_name
VIEWTABLE SELECT/INSERT/UPDATE/DELETE/ PREFERENCES/ALL PREVILEGES
SELECT/INSERT/UPDATE/PREFERENCES/ALL PREVILEGES
  • 对列授权时,previlege_name 处填写 previlege_name(col_name)ON 后填写表名
  • GRANT OPTION 将给予用户授权的权限,
-- 驳回权限
REVOKE privilege_name
ON object_type object_name
FROM user_name [CASCADE|RESTRICT]
  • 模式授权在创建数据库时完成
CREATE USER user_name [WITH] [DBA|RESOURCE|CONNECT];
  • 缺省权限为 CONNECT
  • 允许的操作如下表
    权限 CREATE USER CREATE SCHEMA CREATE TABLE 数据存取修改
    DBA ✓ \checkmark ✓ \checkmark ✓ \checkmark ✓ \checkmark
    RESOURCE × \times × × \times × ✓ \checkmark ✓ \checkmark
    CONNECT × \times × × \times × × \times × ✓ \checkmark
    拥有相应权限

数据库角色

角色为被命名的权限的集合

-- 创建角色
CREATE ROLE role_name;

-- 授予权限
GRANT privilege_name
ON object_type object_name
TO role_name;

-- 赋予用户角色
GRANT role_names
TO user_1[,user_2,...];

-- 驳回权限
REVOKE privilege_name
ON object_type object_name
FROM role_name;

数据库完整性

实体完整性

  • PRIMARY KEY 不可为空,不可重复

参照完整性

  • 参照表修改可能导致被参照表中没有相应的键
  • 修改时可定义两种操作
    • CASCADE 级联操作,修改所有相关键
    • NO ACTION 拒绝执行
CREATE TABLE student_course (
    sc_s_id CHAR(12),
    sc_c_id CHAR(4),
    sc_score INTEGER,
    PRIMARY KEY(sc_s_id, sc_c_id),
    FOREIGN KEY(sc_s_id) REFERENCES student(s_id)
        ON DELETE CASCADE
        ON UPDATE CASCADE,
    FOREIGN KEY(sc_c_id) REFERENCES course(c_id)
        ON DELETE NO ACTION
        ON UPDATE CASCADE,
);

用户定义完整性

  • NOT NULL 非空
  • CHECK expression 满足表达式
  • UNIQUE 列值唯一
CREATE TABLE student (
   s_id CHAR(12),
   s_dept_id INTEGER NOT NULL,
   s_name CHAR(20) UNIQUE,
   s_sex CHAR(2) CHECK s_sex IN ('m','f'),
   PRIMARY KEY(s_id),
   FOREIGN KEY(s_dept_id) REFERENCES department(d_id)
);

断言

-- 创建断言
CREATE ASSERTION assertion_name
CHECK expression;
-- 移除断言
DROP ASSERTION assertion_name;

触发器

-- 语句级
-- 修改后执行
CREATE TRIGGER trig_name
AFTER UPDATE OF col_name ON table_name
REFERENCING OLD ROW AS old_row
            NEW ROW AS new_row
FOR EACH STATEMENT
BEGIN
    expression;
END;

-- 行级
-- 修改前执行
CREATE TRIGGER trig_name
BEFORE INSERT OR UPDATE ON table_name
REFERENCING NEW ROW AS new_row
FOR EACH ROW
BEGIN
    expression;
END;

-- 移除触发器
DROP TRIGGER trig_name;

关系数据理论

规范化

函数依赖

X → Y X\rightarrow Y XY 则X函数确定Y
X → Y X\rightarrow Y XY 且其真子集 X 1 ↛ Y X_1\nrightarrow Y X1Y,则Y对X完全函数依赖,记作 X → F Y X\xrightarrow{F}Y XF Y
若Y不完全函数依赖于X但 X → Y X\rightarrow Y XY,则Y对X部分函数依赖,记作 X → P Y X\xrightarrow{P}Y XP Y

  • 候选码:K为 R ( U , F ) R(U,F) R(U,F) 的属性/属性组,若 K → F U K\xrightarrow{F}U KF U 则K为R候选码
  • 超码:若 K → P U K\xrightarrow{P}U KP U 则K为R超码

范式

关系模型满足要求的不同程度
5NF ⊂ \subset 4NF ⊂ \subset BCNF ⊂ \subset 3NF ⊂ \subset 2NF ⊂ \subset 1NF

  • 1NF:任何关系模式均满足
    • 消除非主属性对码的部分函数依赖
  • 2NF:非主属性完全函数依赖于任何一个候选码
    • 消除非主属性对码的传递函数依赖
  • 3NF:不存在传递函数依赖
    • 消除主属性对码的部分和传递函数依赖
  • BCNF:关系模式中每一个决定因素都包含码

数据库设计

数据库设计概述

基本步骤

对于一个给定的应用环境,构造(设计)优化的数据亏逻辑模式与物理结构,并据此建立数据库及其应用系统,使之能够有效地存储和管理数据,满足各种用户的应用需求,包括信息管理要求和数据操作要求

物理结构设计阶段
逻辑结构设计阶段
应用
概念结构设计阶段
需求分析阶段
转换
映像
内模式
逻辑模式
外模式1
外模式2
外模式3
概念模式
应用要求1
应用要求2
应用要求3

需求分析

  1. 数据项
  2. 数据结构
  3. 数据存储
  4. 数据流
  5. 处理过程

概念结构设计

概念模型

  • 真实客观反映现实世界
  • 易于理解
  • 易于更改
  • 易于向关系、网状、层次等各种数据模型转换

E-R 模型

E-R 图

  • 实体:矩形
  • 属性:椭圆
  • 联系:菱形
n
m
Entity_1
Entity_2
Attribute
Relation
  • 一般地,会将Entity-Attibute作为一张表,Relation作为一张表,Entity_1中的主键和Entity_2中的主键分别作为Relation表中的外键,参见 学生选课的数据定义(DDL),该关系写作E-R图如下:
n
m
Entity_1
Entity_2
Attribute
Relation

实体间联系

  • 一对一
1
1
Entity_1
Entity_2
Relation
  • 一对多
1
n
Entity_1
Entity_2
Relation
  • 多对多
m
n
Entity_1
Entity_2
Relation
  • 两个以上实体
m
n
p
Entity_1
Entity_2
Entity_3
Relation
  • 单个实体内部
m
n
Entity_1
Relation

概念结构设计

构成基本 E-R 图

  • 实体属性划分原则:现实世界属性尽量作为属性
    • 属性不再具有需要描述的性质
    • 属性和其他实体无关联
  • E-R 图集成
    • 解决冲突,合并对象
      • 属性冲突:协商、统一
      • 命名冲突:协商、重命名、统一
      • 结构冲突:加对象前缀
    • 消除冗余关系、依赖,构成基本E-R图

逻辑结构设计

转化数据模型为逻辑模型

  • 将实体型转化为关系模式
    • 1:1 转化为独立关系模式
    • 1:n 转化为对立关系模式
    • m:n 转化为一个关系模式
    • 多元联系可转化为一个关系模式
    • 相同码的关系模式可以合并

关系查询处理与查询优化

查询处理

查询执行
查询优化
查询检查
查询分析
代码生成
代码执行
代数/物理优化等
语义分析
符号名转换
安全性检查
完整性初步检查
查询树
词法/语法分析

查询优化

  • 查询开销
    • 磁盘存取块数(IO代价)
    • 处理机时间(CPU代价)
    • 查询内存开销
  • 以存取块数作为查询代价衡量单位

代数优化

  • 优先执行选择运算
  • 一起执行同一关系的选择、和投影运算
  • 把投影和其前后的双目运算结合起来
  • 把选择同其前面要执行的笛卡尔积结合起来成为一个连接运算
  • 找出公共子表达式

数据恢复

事务

-- 成功执行,提交
BEGIN TRANSACTION;
-- SQL 语句
COMMIT;

-- 发生异常,回滚
BEGIN TRANSACTION;
-- SQL 语句
ROLLBACK;
  • 注:事务只要到达了COMMITROLLBACK即属于执行成功

事务的特点(ACID特性):

  • 原子性
  • 一致性
  • 隔离性
  • 持续性

故障

  • 故障种类
    • 事务内部故障:即没有到达COMMITROLLBACK,非预期的,应用程序无法自行处理,使用事务撤销UNDO来恢复。
    • 系统故障:使系统非正常停止而重新启动的任何故障。
    • 介质故障:是一种硬故障,存储介质受损。
    • 计算机病毒:文件系统被程序篡改。
  • 前两者:数据不正确,可参照日志文件进行恢复
  • 后两者:数据库被破坏,可参照数据库镜像进行恢复
  • 故障恢复的原理:冗余

恢复

数据转储

备份到其他介质,恢复时仅仅可以恢复到备份时的状态:

  • 动态转储:允许一边执行事务一边执行备份,不保证数据有效。
  • 静态转储:停止主数据库的事务执行,执行备份后再继续。
  • 增量转储:只记录和上一次备份对比不同的部分,类似于存储一个patch。
  • 海量转储:整体备份。

登记日志

SQL Server会循环使用一组固定大小的日志文件空间,对其进行分块,并在块写满的位置记录检查点
日志为记录数据库更新操作的文件,内容包含:\

  • 上一个检查点
  • 事务ID
  • 事务开始与结束时间点
  • 事务的所有操作,对每一条更新操作,单独成一条记录,根据日志文件类型,有两种情况
    • 记录逻辑操作:操作类型(增删改)+ 操作对象 + 操作数据
    • 记录前后象:操作类型(增删改)+ 操作对象 + 操作前值 + 操作后值

为保证数据可恢复,需要遵循以下两条原则:

  • 登记次序严格按照时间顺序
  • 必须先写日志文件,后写数据库

数据恢复

  • 事务故障恢复,系统自动完成:
    • 反向扫描日志(从中断点开始)
    • 遍历该事务的所有操作依次写入操作前值
  • 系统故障恢复,系统重启时自动完成:
    • 正向扫描日志(从检查点开始),遍历已完成事务生成REDO-LIST,遍历未完成的事务生成UNDO-LIST
    • 对UNDO-LIST中的事务,依次写入操作前值
    • 对REDO-LIST中的事务,依次写入操作后值
  • 介质故障恢复:
    • 重装数据库,并重做备份时间点后已完成的事务

并发控制

并发控制概述

事务为并发控制的基本单位

  1. 丢失更改
    Mon 07 Mon 14 Mon 21 Mon 28 R(A)=16 A=A-1 W(A)=15 R(A)=16 A=A-1 W(A)=15 Task 1 Task 2
    • 红色框内的修改丢失
  2. 不可重复度
    Mon 07 Mon 14 Mon 21 Mon 28 R(A)=50,R(B)=50 R(A)=50,R(B)=100 W(B)=100 Task 1 Task 2
    • 红色框内的验和不对
  3. 读“脏”数据
    Mon 07 Mon 14 Mon 21 Mon 28 Mon 04 R(A)=10,A=A*2,W(A)=20 ROLLBACK R(A)=20 Task 1 Task 2
    • 红色框内读到的数据和数据库内容不一致
  • 并发控制机制:使用正确方式调度,是的一个用户事务的执行不受其他事务干扰
  • 主要技术:
    • 封锁
    • 时间戳
    • 乐观控制
    • 多版本并发控制

封锁

  • X锁,排他锁,写锁
    • X锁释放前不允许修改和写入,即不容再加X锁或S锁
  • S锁,共享所,读锁
    • S锁释放前允许再加S锁,即并行读取
    • S锁存在时,不允许写对象,即不允许加X锁

封锁协议

  1. 一级封锁协议:写前加X锁(避免修改丢失)
  2. 二级封锁协议:读前加S锁,读后释放S(避免读“脏”数据)
  3. 三级封锁协议:读前加S锁,事务完成后释放S(避免读“脏”数据和不可重复度)

活锁与死锁

  • 活锁:依次等待锁完成,但是率先加锁的事务有可能一直等待
    • 解决:FCFS(先来先服务)
  • 死锁:即两个或多个任务互相等待,由于都需要使用对方已加的锁而无法继续执行任务
    • 判断:超时法、事务等待图
    • 解决:选择一个可使当前拥塞解锁的,代价最小的事务,将其撤销,释放该事务所有锁,使得其他任务可以执行

并发调度的可串行性

可串行调度

多个事务的并发执行正确 ⇔ \Leftrightarrow 执行结果与按某一次序串行地执行这些任务时相同

  • 可串行化 ⇔ \Leftrightarrow 正确调度,因此可串行性是并发事务正确的准则

冲突可串行化调度

  • 冲突操作:不同事务对同一个数据的读写和写写操作
  • 冲突可串行化调度 ⇒ \Rightarrow 可串行化调度

两段锁协议

  • 事务遵循两段锁协议 ⇒ \Rightarrow 可串行化调度

你可能感兴趣的:(学习)