视频链接

mark一下链接

课程介绍: 网页链接 数据库系统概述:网页链接

数据模型: CH01-2 数据模型

数据库系统的结构: CH01-3 数据库系统的结构

关系模式的数据结构和完整性约束规则: CH02-Part1 关系模式的数据结构…

关系代数: CH02-Part2 关系代数

SQL概述及数据定义语句: CH03 SQL-part1

简单查询及多表连接查询: CH03 SQL-part2

嵌套查询: CH03 SQL-part3

实践课SQL Server示范: MSSQL实践示范

实践课MySQL 示范: MySQL实践示范

关系数据理论-函数依赖与公理系统: CH06 关系数据理论1-upd1

关系数据理论-最小覆盖、正则覆盖、范式与多值依赖: CH06 关系数据理论2

关系数据理论-无损连接、保持函数依赖与模式分解: CH06 关系数据理论3-upd1

关系查询处理与优化: CH09 关系查询处理和查询优化

数据库恢复技术: CH10 数据库恢复技术

并发控制: CH11 并发控制

主要内容

第一章 绪论

概述

  • 数据是数据库中存储的基本对象,数据与其语义密不可分

  • 数据库是长期储存在计算机内,有组织的,可共享的大量数据集合

  • 数据库管理系统(DBMS)

    • 功能:
      • 数据定义功能
      • 数据组织、存储和管理
      • 数据操纵功能
      • 数据库的事务管理和运行管理
      • 数据库的建立和维护功能
  • 数据库系统:将数据库引入计算机系统后的系统构成

image-20220525202211390

数据模型

概念模型

按照用户的观点来对数据和信息建模,例如**E-R(实体-联系)**模型

概念模型是从现实世界到机器世界的第一层抽象,是设计人员和用户之间进行交流的语言

  • 几个基本概念

    image-20220525204127686 image-20220525204240119
  • 实体型之间的联系

    image-20220525204810735

    特殊之处如下图:

    1:1也可以有实体型之间不存在连接

    1:N中的$N\geq0$

    M:N中的$N\geq0,N\geq0$

    image-20220525204949710
  • E-R图:

    image-20220525210400029 image-20220525210445485

    存在一对一联系,也存在多对多联系

    image-20220525210748813image-20220525210836603

    image-20220525210939087image-20220525211029146

逻辑模型

从计算机实现的观点来对数据建模,例如层次模型、网状模型、关系模型、面向对象模型

组成要素

  • 数据结构:描述数据对象的静态特性,数据结构刻画了数据模型的主要特征,因此,常以数据结构的类型来命名数据模型
  • 数据操作:描述数据对象的动态特性,即对象的实例允许执行的操作以及操作规则
  • 完整性约束条件:规定数据库状态以及状态变化应该满足的条件

每个实体和每个多对多联系,最终都会用一个关系来实现,实体的属性就是关系的属性,实体的码就是关系的码,两个实体的多对多联系其对应的关系的属性来自两个关系的码加上来自关系自己的属性,而且那两个实体的码将联合起来做这个关系的主码

E-R图实例

下图一共需要六张表

学生、课程、教师三个实体需要三张表

三个联系也需要三张表

一共需要六张表

上述概念模型中学生和老师之间的联系是多余的,可以删掉


下图就需要四张表


图书管理系统中读者和书应该是N:N的,一本书可以被多个读者借阅过

下图中1:N就不合适


酒厂

下图中从左到右的改进

image-20220525235250624image-20220525235339295

酒和厂家之间是一对多的联系,上图只需要两个表,与上面的学生选修课程的类似也是两个实体+一个联系,但选修课程需要三个表,因为选修课程是多对多的N:N关系,而这个是一对多的1:N的关系

只需要在一对多的“多”那一端多加一个属性(一端的主码)即可


image-20220531101407643

上图中食物的“评分”和“价格”并非其独有属性,应该是“供应”这个联系的属性

如下图所示:(包含实现需要用的表的结构)

image-20220531101602274

演员-电影-制片公司

根据语义取舍E-R图的结构

要求:

image-20220531102311076

以下两种E-R图都可行,要根据语义取舍

  • A:需要五个关系

    image-20220531102343074
  • B:只需要四个关系

    可以储存制片公司和演员之间的信息,例如:“一个演员的片酬如何由相应的制片公司分摊”

    三个实体之间的三元联系和两两之间的二元联系是不等价的,其各自表达的语义也不相同


  • 多对多联系和实体之间是可以互相转化的

    image-20220531102744364

层次模型

结点的双亲是唯一的

层次模型只能处理一对多的联系

其数据结构就是普通的树

多对多的联系在层次模型中 采用间接表达,多对多分解成一对多

层次模型是数据库系统中最早出现的数据模型

网状模型

  • 允许一个以上的结点没有双亲

    一个结点可以有多余一个的双亲(否定了树形结构)

同样只能直接处理一对多的实体联系,多对多要间接处理

关系模型

  • 最重要的一种数据模型,也是目前主流的数据模型
  • 关系模型的数据结构是一张二维表,由行和列组成
image-20220531110926397

冗余的列信息表达彼此之间的联系

  • 一些概念:

    image-20220531111001397 image-20220531111013391

    关系模式举例:学生(学号,姓名,年龄,性别,系,年级)

    举例:

    image-20220531111200601

数据库系统的结构

三级模式结构

二级映象功能与数据独立性

从用户角度看数据库系统的结构

模式结构

也就是

内模式(数据物理结构和存储方式)

模式(数据逻辑结构和特征)

外模式(局部数据的逻辑结构和特征)

  • 模式

    image-20220531151349843
  • 外模式

    image-20220531151505484 image-20220531151639841

    外模式与应用的关系:一对多

    外模式是保证数据库安全的有效措施

  • 内模式:存储模式、物理模式

    一个数据库只有一个内模式

    image-20220531152021867

结构图:

image-20220531152151227
  • 外模式/模式映象

    用途:保证数据的逻辑独立性

  • 模式/内模式映象

    image-20220531152619856

    用途:保证数据的物理独立性

    image-20220531152653987
  • 模式结构实操

    image-20220531153442438

用户角度看数据库系统的结构

  • 单用户数据库系统

    整个数据库系统(应用程序、DBMS、数据)装在一台计算机上,为一个用户独占,不同机器之间不能共享数据

  • 主从式结构的数据库系统

    一个主机带多个终端

    image-20220531153946977
  • 分布式结构

    image-20220531154036340
  • 客户/服务器结构(C/S结构)

    应用程序需要安装

    启动独立的窗口

    示意图:某些主机安装DBMS成为数据库服务器,另外的安装客户应用程序

    image-20220531154346149
  • 浏览器/服务器结构(B/S结构)

    不需要安装

第二章 关系数据库

关系模型的三大要素:数据结构、数据操作、完整性约束规则

关系数据操作语言:关系代数语言、关系演算语言和结构化查询语言(SQL)

关系数据结构

关系中的概念

  • 域:一组具有相同数据类型的值的集合

    image-20220531160243447
  • 笛卡尔积:所有域所有可能取值的组合

    image-20220531160325244

    元组和分量

    image-20220531160858336

    基数

    image-20220531161005134
  • 关系:

    关系是笛卡尔积中有意义的子集

    image-20220531161201911

    关系中不同的列可以对应相同的域,但每一列都必须有各自的属性

    n目关系必有n个属性

    例如:一个关系中既有出生日期,也有参加工作的日期,这是两个属性,但他们都来自日期域

    候选码-全码-主码-外码

    image-20220531161545750 image-20220531161600479

    主码和对应的外码可以不同名,但语义应该相同

    举例:

    image-20220531161657359

    “成绩”关系中主码由两个属性“学号”和“课号”组成

  • 三类关系

    image-20220531163205987

关系模式

image-20220531163940912

关系数据库

image-20220531163954676

关系操作

  • 关系代数-关系演算-SQL

    image-20220531164537266

关系的完整性

实体完整性

image-20220531164743293

主属性不能取空值,所有的主属性都不能取空值

参照完整性

主码和对应的外码可以不同名,但语义应该相同

image-20220531165038902

但是在下面的例子中

由于“选修”关系中,“学号”和“课程号”既是外码,也是主码,既要遵循实体完整性,又要遵循参照完整性,所以两个属性不能取空值

image-20220531165144440

用户定义的完整性

image-20220531165431075

举例:

下图中AD可以,BCE不可以插入

image-20220531165654152

关系代数

概述

关系代数是一种抽象的查询语言,用对关系的运算来表达查询

运算对象和结果都是关系,运算符有:集合、关系、比较、逻辑

image-20220531184230166 image-20220531184324293

传统的集合运算

注意关系代数表达

  • 并:

    image-20220531185013078
  • 差:

    image-20220531185029973

    差运算不满足交换律

  • 交:

    image-20220531185052296
  • 元组的连接

    image-20220531184829707
  • 笛卡尔积

    image-20220531185128653

专门的关系运算

几个记号

image-20220531185249563image-20220531185259597

image-20220531185339927

【象集】的实例:

image-20220531190319630
image-20220531190420922
  • 选择$\sigma$

    image-20220531190450714

    举例:

    image-20220531190557580

    且有下面的式子

    image-20220531190635898

    要能根据查询需求写出关系代数的式子

  • 投影$\pi$

    image-20220531191739470

    “从R(U)中选择出若干属性列组成新的关系”

    投影的结果要去掉相同的行

    通常情况下投影和选择不满足交换律

  • 投影与选择的区别

    选择是对行的筛选,投影是对列的筛选

    image-20220531192208849
  • 连接$\theta$

    image-20220531192333625 image-20220531192520207

    等值连接自然连接

    image-20220531192621811

    R和S中都有叫做B的属性,为了以示区别,要使用R.B和S.B

    等值连接

    image-20220531192932506

    上述连接结果中R.B和S.B两列属性完全相同,将相同的属性去重,即得到自然连接的结果(自然连接要连接所有的相同属性)

    image-20220531193037704
  • 外连接

    悬浮元祖:被丢弃的元组

    image-20220531193123154

    例如下图:

    image-20220531193204058

    自然连接可以用基本的关系运算表达:

    image-20220531194222808
  • image-20220531194350451

    例子:

    R÷S的结果一定来自R中除了(R和S共有属性)之外的属性,即属性A

    image-20220531194453378
    image-20220531194644465

    一般用来选择:“选修了所有选修课的人”、“在所有案发现场都有踪迹的人”

    image-20220531194949997

    用基础运算表达:

    image-20220531195027285 image-20220531195051264

例题

image-20220531195951966image-20220531200002026

image-20220531200027871image-20220531200116746

image-20220531200327945image-20220531200512073

image-20220531200600535image-20220531200746468

image-20220531200803072image-20220531201111858image-20220531201127937

总结

第三章 SQL

SQL概述及数据定义语句: CH03 SQL-part1

image-20220601210231759

SQL基本概念

表对应模式,视图对应外模式,存储文件对应内模式

image-20220601211634969

基本表-视图-游标-查询表

image-20220601211819460

游标是集合运算和行运算的桥梁

image-20220601211850645

成绩管理数据库

本章举例都用到这个表

image-20220601212041667

实例:

image-20220601212102426

数据定义

数据定义语句

image-20220601212344719image-20220601212422700

模式的定义

直接跳过了

基本表的定义

image-20220601213330599

最常用的完整性约束

image-20220601213429619

primary key与unique的区别

[]内为可选内容

[,...n]表示可以重复n次

image-20220601213943654
  • 列约束

    image-20220601214131377

    ON DELETE和ON UPDATE是参照完整性约束,决定级联删除和级联更新

    CHECK是用户定义的完整性约束

  • 表约束

    与列约束不同的是没有NULL与NOT NULL的约束

    PRIMARY KEY约束要加上(列名[ASC|DESC][,...n])

    外码约束FOREIGN KEY同样

    image-20220601215243376

  • 数据类型:

    image-20220601215620181

image-20220601215830992

创建表

image-20220601220125319

列约束写法:

image-20220601220215719 image-20220601220709774

删除表

image-20220601220821594

修改基本表

image-20220601220919032 image-20220601220954136 image-20220601221023003

索引的定义

  • 建立索引是加快查询速度的有效手段
image-20220601221133701

建立索引

普通索引vs聚簇索引

image-20220601221433080

删除索引

image-20220601221527341

例如

image-20220601221555550

修改索引

最好先drop,再create

数据字典

image-20220601221733777

数据查询

单表查询

简单查询及多表连接查询: CH03 SQL-part2

  • 基本结构:

    image-20220606085709029
  • from子句

    image-20220606090702525 image-20220606090715259
  • where子句

    image-20220606090748383

image-20220606092321144

上述展示了三种重命名的方式


distinct对查询结果进行去重


image-20220606092758725

LIKE表示模糊查询/模式匹配

例3.28表示以U2017开头的任何字符串都满足条件

例3.29表示以U2016/U2017开头

image-20220606093102538

如果要查询的字符串本身就含有%_

在下例中%/%%,两侧的%表示通配符,中间的用/转义的%表示要查询的%

image-20220606093920492

select Sno,Cno from SC where Grade IS NULL

NULL要用IS进行选择,不能用=或≠


聚集函数

image-20220606110026776

病句:

image-20220606110109908

兼容的正确写法:

image-20220606110210544

使用了嵌套查询


分组统计查询(Group by

合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句

HAVING是先分组再筛选记录,WHERE在聚合前先筛选记录。

也就是说WHERE作用在GROUP BY 子句和HAVING子句前;而 HAVING子句在聚合后对组记录进行筛选

例3.39:

image-20220606110852485

在上例的基础上加上“且成绩在90分以上”,写法如下:

image-20220606111307795

sql语句中where和having的区别

WHERE 在分组和聚集计算之前选取输入行(因此,它控制哪些行进入聚集计算), 而 HAVING 在分组和聚集之后选取分组的行。

因此,WHERE 子句不能包含聚集函数; 因为试图用聚集函数判断那些行输入给聚集运算是没有意义的。 相反,HAVING 子句总是包含聚集函数

如下例,控制平均成绩在80分以上,只能使用having子句,不能使用where子句

image-20220606111741823 image-20220606111906245

group by之后的列表,必包含select列表中除去集函数之后的列表


列出至少有三门功课在90分以上的学生学号及这些同学的平均成绩

image-20220606112323624

难点在于确认行选择where组选择having的写法

==不能在行选择中加入条件“成绩>90分”,这样的话求的平均成绩就是大于90分那些课的平均成绩了,所以两个限制条件(“三门”和“90分以上”)都要在having子句中实现==

用函数实现

image-20220606112544165

兼容的写法:(嵌套查询)

image-20220606112635794
image-20220606164823671

仍然是利用top 3linmt 3

image-20220606165038127

group by left(sname,1)之后,count(*)就表示对surname进行计数

连接查询

  • 等值连接

    image-20220606165556438 image-20220606165939414

    通过在FROM子句中指定连接类型,也可以实现,如下:

    image-20220606170135352

列出每门课的间接先修课(先修课的先修课)

image-20220606170821663 image-20220606170853520

既选修课1,又选修课2的学生的学号(将表自身做等值连接)

image-20220606171205714

右外连接

image-20220606171513682

外连接+where行选择

image-20220606171805427

外连接的连接条件无法用where子句的条件替代

而内连接join是可以用where替代的,前面例子中也有提到


image-20220606172358291

group by分组不能只有Sno,必须有sname

因为:(参考例3.39)

统计函数和组别属性不一定非要出现在查询列表中,但非统计函数及非组别属性,一定不允许出现在查询列表中

人话:

查询列表(select后面跟的)∈ [组别属性(group by 后面跟的)+统计函数(Avg、Max等)]

也就是说:

select < group by + having

嵌套查询

嵌套查询: CH03 SQL-part3

  • 一个例子:

    image-20220627105014192

    这个例子也可以用自身连接实现:

    image-20220627105241696
  • 又一个例子:

    image-20220627105653482

    用嵌套查询写:

    image-20220627105846290
  • 列出每个同学超过其平均成绩的课程号:

    X.sno是父查询中的sno,``sno=X.sno`表示相关子查询

    子查询的执行结果每次都不同,和父查询的``X.sno`相关

    image-20220627110201506
  • 谓词:

    image-20220627120552580
  • exists谓词:

    image-20220627122223634

    exists和in谓词可以互相替代:

    image-20220627133451088

    一个替换的例子:

    image-20220627133641451image-20220627133825328

    没有选修数据库的学生学号和姓名:not exists

    image-20220627133951292

    exists谓词是逻辑表达能力最强的谓词

  • SQL没有全称量词,但总是可以把带有全称量词的谓词转换为等价的带有存在量词的谓词

    image-20220627134429388
    • 查询选修了全部课程的学生姓名→不存在有一门课程,该学生没有选修

      image-20220627134729624
  • 例子:

    image-20220627153730747

    语句:

    使用exists子查询

    image-20220627153750828
  • 查询至少选修了学生15122(学号)选修的全部课程的学生学号

    image-20220627153947836 image-20220627154315828

    结果:

    image-20220627154539663
  • 求既选修了1号又选修了2号课程的学生学号:

    image-20220627155036774
  • 求至少选修了两门课程的学生学号:

    image-20220627155148899

    使用集函数:

    image-20220627155234191

    group by

    image-20220627155315466

集合查询

查询结果进行集合操作

image-20220627155351886

基于派生表的查询

  • 列出每个同学超过其平均成绩的课程号

    原先的相关子查询的方法:

    image-20220627160204123

    弊端是每个记录都要计算一次平均成绩

    下图,使用基于派生表的查询

    image-20220627160517754

    用join子句表达:

    image-20220627160550321

    where子句中的两个或一个条件均可以移到on中表达

    image-20220627160619544
  • 列出至少有三门课程成绩90分以上的学生学号及其平均成绩(基于派生表)

    先筛选出有三门课程90分以上的学生得到派生表,连接条件是sc.sno=cnt.sno

    group by sc.sno并求平均成绩

    image-20220627160743183

    嵌套查询方法 in谓词

    image-20220627161122569

    exists谓词

    image-20220627161144241
  • 列出计算机系(‘CS’)没有获得‘数据库’课程学分的男生学号和姓名

    image-20220627161626326image-20220627161640822

第六章 关系数据理论

函数依赖

==X→Y:X确定Y Y依赖于X==

  • 定义:

    排除函数依赖,只需要一组反例,不满足上面的规定

    image-20220627170348495

    函数依赖也可以成组

    image-20220627170539656
  • 一个例子:

    image-20220627170747656
  • 相互依赖和不依赖的符号:

    image-20220627170817616
  • 有关函数依赖的几点说明

    image-20220627203815380
  • 函数依赖与属性之间的联系类型有关

    image-20220627204726693

    1:1 X↔Y

    m:1 X→Y

    m:n 无函数依赖

  • 仅对于下图:

    因为==找不出反例==,所以B→ABCDE成立

    image-20220627205144825 image-20220627205232975
  • 平凡函数依赖和非平凡函数依赖

    image-20220627205525100
  • 完全函数依赖与==部分==函数依赖

    (多不多于)

    image-20220627205712605
  • ==传递==函数依赖:

    image-20220627210024960
  • image-20220627210113986
  • 外码

    image-20220627210254679

函数依赖的公理系统

  • 逻辑蕴含

    image-20220627210529587
  • 函数依赖集的闭包

    image-20220627210738400
  • 属性集的闭包

    image-20220627211059302

    由于任何属性都能函数决定自己,所以属性集的闭包不可能是空集

  • Armstrong公理系统

    image-20220627213536788
    • 其正确性和完备性:

      image-20220627213612022
    • 合并律、分解律、伪传递律

      image-20220627213637896
  • 揭示了函数闭包与属性集依赖之间的关系

    • 引理6.2:

      image-20220628085510100
    • 引理6.3:

      image-20220628085607656
  • 一个例子:

    image-20220628085826149
  • ==求属性集闭包的算法==

    image-20220628085946290
    • 一个例子:

      image-20220628090046139
    • 一个例子:

      image-20220628090158294
    • 一个例子:

      image-20220628090236873
  • 函数依赖集的等价定义:

    image-20220628093306937

    方法:

    image-20220628093355707
  • 极小函数依赖集

    image-20220628093454429
    • 做法:

      image-20220628094159408 image-20220628094209720 image-20220628094704830
    • 最小依赖集不一定是唯一的,和循环中的处置顺序有关

      image-20220628095508817
  • 正则依赖Fc

    image-20220628101744928

    在求得最小依赖集后,将左部相同的函数依赖合并,即得到正则依赖

  • 求关系模式的候选码

    • 一些定义:(**==是针对属性定义的==**)

      image-20220628101941878
    • 两个结论:

      image-20220628102024378
    • 求候选码的步骤:

      image-20220628102241010
    • 一个例子:

      ==(AD)^+^表示AD的闭包==

      image-20220628102412702

范式与规范化

  • 范式:

    image-20220628103656120
  • 1NF:

    image-20220628103758635
  • 2NF:

    image-20220628104529018
  • 3NF:

    不允许非主属性对码的传递性依赖

    image-20220628104821017
    • 任何二元关系模式R(A,B)必为3NF

    • 没有非主属性的范式一定是三范式3NF

    • 3NF仍然可能存在冗余与更新异常,因为还可能有主属性对候选码的部分函数依赖和传递函数依赖

  • BCNF:

    每一个非平凡函数依赖左部一定包含一个候选码

    image-20220628110728494

    如果R∈BCNF,则R∈3NF

    image-20220628110902557
    • 事实上,3NF有另外一个定义:关系模式R的所有非平凡函数依赖,要么左侧包含候选码,要么右侧是主属性
    • 任何二元关系模式R(A,B)必为BCNF

    一个例子:

    image-20220628151110736

多值依赖、4NF

关系数据理论-无损连接、保持函数依赖与模式分解: CH06 关系数据理论3-upd1

没看


第八章

第九章 关系查询处理和查询优化

查询处理

4个阶段:

查询分析

查询检查

查询优化

查询执行

查询操作算法示例

选择操作

image-20220628154138724 image-20220628154151949

连接操作

image-20220628154604206

查询优化

  • 代价模型

    image-20220628155031861
  • 代数优化和物理优化:

    image-20220628160449040

代数优化

关系代数的等价变换规则

  • 几种运算的交换律和结合律

    image-20220628160702187
  • 投影的串接定律

    image-20220628160728141
  • 选择的串接定律

    image-20220628160900072
  • 选择与投影的交换律

    image-20220628160920618
  • 选择与笛卡尔积的交换律

    先选择再做笛卡尔积

    image-20220628161042972
  • 选择与一些运算的分配律

    确保先做选择,再做其它运算

    image-20220628161156365 image-20220628161217518
  • 等等

查询树的启发式优化

image-20220628161929414 image-20220628161950983

优化查询树步骤

  1. ==分解选择运算==
  2. ==通过交换选择运算,将其尽可能移动到叶端==
  3. ==通过交换投影运算,将其尽可能移动到叶端==
  4. ==合并选择和投影的串接==
  5. ==对内结点分组(用双目运算分隔)==

例子1

例子2

image-20220628163520356 image-20220628163541730 image-20220628163558073 image-20220628163612877

投影运算在下移的过程中要保留连接的属性(下图中多出来的cno)

image-20220628163843088

蓝色箭头处的投影可以去掉,其他的投影运算都跟在一个选择或连接运算之后,而箭头处的没办法和选择/连接运算一起,导致产生额外的开销

物理优化

代数优化改变查询语句中操作的次序和组合,不涉及底层的存取路径

物理优化就是要选择高效合理的操作算法或存取路径,求得优化的查询计划

没看

第十章 数据库恢复技术

事务的基本概念

事务是恢复并发控制的基本单位

  • 事务的ACID特性:
    原子性(Atomicity)一致性(Consistency)
    隔离性(Isolation)持续性(Durability )

  • commit和rollback

    image-20220628184111027
  • 一个例子:

    image-20220628184339495

恢复的实现技术

日志文件

  • 主要有两种格式:

    • 以记录为单位的日志文件

      image-20220628191516894
    • 以数据块为单位的日志文件

      image-20220628191607255
  • 日志文件的作用:

    image-20220628191702178

恢复的策略

  • 事务故障的恢复步骤

    image-20220628192753366
  • 系统故障的恢复

    image-20220628192855132
  • 一个例子:

    image-20220628204406098 image-20220628203935704
  • 介质故障的恢复步骤

    image-20220628204542564 image-20220628204618445

    因为装入的是以前的数据库副本,所以不需要UNDO日志中未提交的事务

具有检查点的恢复技术

  • 提出问题:

    image-20220628205031972 image-20220628205156760

    检查点记录的内容:

    • 建立检查点时刻所有正在执行的事务清单
    • 这些事务最近一个日志记录的地址
  • 通常故障发生时,【重新开始文件】的最后一个检查点记录最有价值

    image-20220628205543329
  • 在检查点如何维护日志文件:

    image-20220628205726228
  • 使用检查点可以提高恢复效率

    image-20220628205841538
  • 例子:

    image-20220628210016467
  • 步骤

    注意:将UNDO-LIST初始化为ACTIVE-LIST

    每遇到一个新开始的事务,就送入UNDO-LIST,有提交的事务,则将其从UNDO-LIST移入REDO-LIST

    image-20220628210226515

数据库镜像

SQL Server的恢复技术

都没看

小结

第十一章 并发控制

  • 并发操作可能带来的数据不一致性

    image-20220628211711539
  • 丢失更新举例:

    image-20220628211819822
  • 读脏数据

    image-20220628211847524
  • 读脏举例:

    image-20220628211908776
  • 不可重复读:

    image-20220628211950071
  • 不可重复读举例:

    image-20220628212250572

封锁

  • 封锁的类型:

    image-20220628212657748
  • 封锁类型的相容矩阵

    image-20220628212851669

    一个对象上如果有两个锁,那一定是两个S锁

封锁协议

约定何时申请X锁或S锁,以及持锁时间、何时释放

  • 一级封锁协议:

    只能防止丢失更新

    image-20220628213406030
  • 二级封锁协议:

    防止丢失更新+读脏

    image-20220628213838808

    但还是无法避免【不可重复读】

  • 三级封锁协议:

    X锁和S锁都是事务结束才释放

    三种问题全都能防止

  • 三种协议主要区别:

活锁和死锁

  • 活锁:

    image-20220628214729493
  • 死锁:

    image-20220628214751092
  • 死锁产生条件:

    image-20220628214823440
  • 死锁的预防:

    一次封锁法:每个事务事先一次获得所有所需数据的全部锁

    顺序封锁法:预先对数据对象规定一个封锁顺序,所有事务都按这个顺序实行封锁

  • 死锁的监测:
    超时法:一个事务的等待时间超过了规定的时间,就认为发生了死锁

    等待图法:image-20220628215312106

并发调度的可串行性

  • 一个不可串行化的调度:

    产生了不可重复读的问题,遵循的是二级封锁协议

    image-20220629101957714
  • 可串行化的调度:

    image-20220629102211552
  • 冲突

    image-20220629102510850
    • 冲突可串行化调度

      冲突可串行化的调度一定也是可串行化调度

      image-20220629104551341
    • 冲突可串行化调度是可串行化调度的充分条件,不是必要条件

      可串行化调度不一定是冲突可串行化调度

      image-20220629105352458

两段锁协议

  • 定义:

    image-20220629105610495
    • 在释放一个封锁之后,事务不再获得任何其他封锁
  • 一次封锁法和两段锁协议

    image-20220629110305798

封锁的粒度

image-20220629111105964 image-20220629111129674