0% found this document useful (0 votes)
57 views38 pages

Predicted

该文档涵盖了数据库系统的多个方面,包括数据抽象、关系模型、SQL、数据库设计、事务和并发控制等。每个部分包含选择题、填空题和简答题,提供了相关概念的定义、解析和应用示例。重点强调了数据库设计的规范化、事务的ACID特性以及并发控制的重要性。

Uploaded by

loveff0728
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
57 views38 pages

Predicted

该文档涵盖了数据库系统的多个方面,包括数据抽象、关系模型、SQL、数据库设计、事务和并发控制等。每个部分包含选择题、填空题和简答题,提供了相关概念的定义、解析和应用示例。重点强调了数据库设计的规范化、事务的ACID特性以及并发控制的重要性。

Uploaded by

loveff0728
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

第一部分 引言

选择题

1. 数据抽象在数据库系统中主要用于:
A. 提高数据存储效率
B. 隐藏数据的具体实现细节
C. 增加数据的安全性
D. 优化查询性能

答案: B

解析: 数据抽象通过分层次的视图(如外部视图、概念视图和内部视图)隐蔽了数据的具体存储实
现,使用户能够专注于数据的逻辑结构,而无需了解底层细节。

第二章 关系模型介绍
填空题

2. 在关系数据库中,确定一个关系的唯一标识属性称为__。

答案: 码(Key)

解析: 码是能够唯一标识关系中每个元组的属性或属性组合。

第三章 初级SQL
选择题

3. 以下哪个SQL语句用于删除表中的所有记录但不删除表结构?
A. DROP TABLE
B. DELETE FROM
C. TRUNCATE TABLE
D. REMOVE FROM

答案: C

解析: TRUNCATE TABLE 语句用于删除表中的所有记录,同时保留表结构。与 DELETE FROM 不


同, TRUNCATE 通常更高效。

第四章 中级SQL
简答题

4. 请简述视图(View)在数据库中的作用及其优点。

答案:
视图是基于一个或多个表的虚拟表,存储了查询的结果集。它在数据库中主要有以下作用和优点:

数据安全性:通过视图可以限制用户访问表中的特定数据列,保护敏感信息。

简化复杂查询:将复杂的查询逻辑封装在视图中,用户只需查询视图即可获取所需数据。

数据独立性:视图提供了一层抽象,使得底层表的结构变化不会影响到使用视图的应用程序。
提高复用性:同一视图可以被多个用户或应用程序复用,减少重复工作。

第五章 高级SQL
选择题

5. 触发器(Trigger)在数据库中的主要用途是:
A. 优化查询性能
B. 自动执行预定义的操作
C. 创建索引
D. 管理用户权限

答案: B

解析: 触发器是数据库中的一种特殊存储过程,在特定事件(如插入、更新、删除)发生时自动执
行,用于保持数据一致性、实施复杂的业务逻辑等。

第六章 形式化关系查询语言
填空题

6. 关系代数中的自然连接运算是两个关系在所有共有属性上的__。

答案: 等值连接

解析: 自然连接在两个关系的所有共有属性上进行等值连接,返回符合条件的组合元组,同时消除
重复属性。

第七章 数据库设计和E-R模型
选择题

7. 在实体-联系模型中,用于表示实体之间的交互关系的元素称为:
A. 实体集
B. 属性集
C. 联系集
D. 约束集

答案: C

解析: 联系集用于表示不同实体集之间的交互关系,如“学生选修课程”中的“选修”联系。

第八章 关系数据库设计
简答题

8. 请解释第三范式(3NF)及其在数据库设计中的重要性。

答案:
第三范式(3NF)要求一个关系满足第二范式(2NF)并且所有非主属性不传递依赖于任何候选
码。即,任何一个非主属性不能依赖于其他非主属性。3NF的主要目的是消除数据冗余和避免更新
异常,从而提高数据库的设计质量和数据的一致性。
第十章 存储和文件结构
填空题

9. RAID 5级别通过__来提高数据的可靠性。

答案: 奇偶校验

解析: RAID 5通过在多个磁盘上分布存储奇偶校验信息,实现数据冗余,从而在单个磁盘故障时仍


能恢复数据,提升可靠性。

第十一章 索引与散列
选择题

10. 在顺序索引中,如果每个关键字在索引表中都有对应的记录,则该索引类型为:
A. 稀疏索引
B. 稠密索引
C. 聚集索引
D. 非聚集索引

答案: B

解析: 稠密索引指的是索引表中的每个关键字都对应一个记录,适用于每条记录都有索引的情况。

第十二章 查询处理
简答题

11. 请描述嵌套循环连接(Nested Loop Join)的基本工作原理及其适用场景。

答案:
嵌套循环连接是一种基本的连接算法,其工作原理是对于外部关系中的每一个元组,扫描内部关系
中的所有元组,查找满足连接条件的元组。适用于:

外部关系较小,内部关系较大且没有适当索引时。

数据量不大或索引不可用的简单连接操作。

由于其时间复杂度为O(n²),在大规模数据集上性能较差,但实现简单,适用于特定场景。

第十三章 查询优化
选择题

12. 基于成本的查询优化器主要依据什么来选择最佳的执行计划?
A. 查询的复杂度
B. 数据库用户的偏好
C. 预估的执行代价
D. 查询语句的长度

答案: C

解析: 基于成本的查询优化器通过估计各种可能执行计划的代价(如I/O操作次数、CPU使用率
等),选择预计成本最低的执行计划作为查询的最佳执行方案。
第十四章 事务
填空题

13. 事务的四大特性通常被称为___(ACID)。

答案: 原子性、一致性、隔离性、持久性

解析: ACID是事务的四大核心特性,保证事务在数据库中的正确性和可靠性。

第十五章 并发控制
简答题

14. 请简述两阶段封锁协议(Two-Phase Locking Protocol)的基本原理及其在并发控制中的作用。

答案:
两阶段封锁协议规定事务在执行过程中分为两个阶段:

扩展阶段(Growing Phase):事务可以申请锁,但不释放任何锁。

收缩阶段(Shrinking Phase):事务只能释放锁,不能再申请新的锁。

该协议通过确保所有锁的获取在释放之前完成,从而避免了死锁和保持并发执行的串行化,确保事
务的隔离性和一致性。

第十六章 恢复系统
选择题

15. 在数据库恢复过程中,如何通过日志来重做事务的操作?
A. 按时间顺序撤销所有未完成的事务
B. 只撤销已经提交的事务
C. 按日志记录的顺序重新执行已提交事务的操作
D. 删除所有日志记录

答案: C

解析: 在恢复过程中,通过重做(Redo)已提交事务的操作,确保所有已提交的变化都被正确地
应用到数据库中,以维持数据的一致性和持久性。

综合题
综合题

16. 请结合实体-联系模型和关系数据库设计的知识,设计一个简单的大学选课系统的E-R图,并说明其
关系模式的设计过程。

答案:
设计过程:

1. 识别实体集:学生(Student)、课程(Course)、教师(Teacher)。

2. 识别属性:

学生:学号(StuID,主码)、姓名、年龄等。

课程:课程号(CourseID,主码)、课程名称、学分等。

教师:教师号(TeacherID,主码)、姓名、职称等。
3. 识别联系集:

选课(Enroll):连接学生和课程,属性包括成绩。

教授(Teach):连接教师和课程。

4. 确定联系的基数:

学生与课程:多对多,一个学生可以选多门课程,一门课程也可以被多名学生选修。

教师与课程:一对多,一个教师可以教授多门课程,一门课程由一名教师教授。

5. 转换为关系模式:

学生(StuID, Name, Age, ...)

课程(CourseID, CourseName, Credits, TeacherID)

教师(TeacherID, Name, Title, ...)

选课(StuID, CourseID, Grade)

E-R图描述:

实体集学生、课程、教师分别用矩形表示,属性用椭圆表示,联系集选课和教授用菱形表示。
联系的基数如多对多、一对多通过连线上的符号标注。

解析:
通过E-R模型的设计,确保了数据库的结构能够准确反映大学选课系统的业务需求,满足数据的完整
性和一致性。

其他重点知识点
选择题

17. 在数据库设计中,规范化的主要目的是:
A. 提高查询速度
B. 减少数据冗余和避免更新异常
C. 增加数据库的安全性
D. 简化数据模型

答案: B

解析: 规范化通过分解关系模式,消除数据冗余,避免插入、删除和更新异常,提升数据库设计的
质量和一致性。

填空题

18. 在SQL中,用于分组聚合的子句是__。

答案: GROUP BY

解析: GROUP BY 子句用于将查询结果按照一个或多个列进行分组,以便对每个组应用聚合函数


(如COUNT、SUM、AVG等)。

简答题

19. 请解释事务的隔离性(Isolation)及其在多事务环境中的重要性。

答案:
事务的隔离性指的是多个事务并发执行时,每个事务的操作对其他事务是隔离的,即一个事务的中
间状态对其他事务不可见。隔离性的重要性体现在:
防止脏读:一个事务读到另一个事务未提交的数据。

防止不可重复读:一个事务在两次查询之间,另一个事务修改了数据。

防止幻读:一个事务在两次查询之间,另一个事务插入了新的记录。

高隔离性保证了事务的独立性和数据的一致性,是数据库并发控制的重要目标。

综合题

20. 假设有两个事务T1和T2,T1执行以下操作:读取账户A的余额,扣除100后更新余额。T2执行以下
操作:读取账户A的余额,增加200后更新余额。请说明在没有并发控制的情况下,最终账户A的余
额可能出现的错误,并说明如何通过并发控制机制解决该问题。

答案:
可能出现的错误:

丢失更新:两个事务可能同时读取相同的初始余额,分别进行修改,最终只有一个事务的修改
被保存,另一个事务的修改被覆盖,导致数据不一致。

解决方法:

使用锁机制:在T1和T2操作账户A时,加上排他锁(X锁),确保同一时间只有一个事务可以
修改账户A的余额,防止并发冲突。

事务隔离级别:设置较高的隔离级别(如可串行化),确保事务的操作按顺序执行,避免数据
冲突和丢失更新。

解析:
并发控制通过锁机制和事务隔离级别,确保事务之间的操作不会相互干扰,从而维护数据的一致性
和完整性。

第一部分 引言
选择题

1. 数据库系统的数据视图主要包括以下哪几种视图层次?
A. 外部视图、内部视图、概念视图
B. 用户视图、管理员视图、开发者视图
C. 逻辑视图、物理视图、过程视图
D. 表视图、索引视图、视图视图

答案: A

解析: 数据库系统的数据视图通常分为三层:外部视图(用户视图)、概念视图和内部视图。外部
视图提供给不同用户的不同数据视图,概念视图是整个数据库的逻辑结构,内部视图描述数据在存
储介质上的物理存储方式。

填空题

2. 数据库定义语言(DDL)主要用于__数据库对象的创建、修改和删除。

答案: 定义

解析: 数据定义语言(Data Definition Language, DDL)用于定义数据库结构,包括创建、修改和


删除数据库中的各种对象,如表、视图、索引等。
简答题

3. 简述DML(数据操纵语言)与DDL(数据定义语言)的区别。

答案:
DML(数据操纵语言)和DDL(数据定义语言)是数据库语言中的两种主要类型:

DML(Data Manipulation Language): 用于数据的查询和修改,包括插入(INSERT)、


删除(DELETE)、更新(UPDATE)和查询(SELECT)等操作。DML主要关注于数据本身的
操作和管理。

DDL(Data Definition Language): 用于定义和管理数据库的结构,包括创建


(CREATE)、修改(ALTER)、删除(DROP)等命令。DDL主要关注于数据库对象(如表、
视图、索引)的定义和结构调整。

解析: DML和DDL在功能上有所不同,DML关注数据的实际内容和操作,而DDL关注数据库的结构
和对象定义。

第二章 关系模型介绍
选择题

4. 在关系数据库中,一个关系的候选码必须满足以下哪些条件?
A. 唯一性
B. 最小性
C. 完整性
D. 以上皆是

答案: D

解析: 候选码(Candidate Key)必须满足唯一性(能够唯一标识每个元组)、最小性(不包含多


余属性)以及完整性(保证每个元组都有一个唯一标识)。因此,所有选项均为候选码的必要条
件。

填空题

5. 在关系模型中,__ 是指一个属性集合能够唯一地标识关系中的每一个元组。

答案: 码(Key)

解析: 码(Key)是关系模型中的一个重要概念,用于唯一标识关系中的每一个元组。不同类型的
码包括主码(Primary Key)、候选码(Candidate Key)等。

简答题

6. 什么是模式图(Schema Diagram),它在数据库设计中的作用是什么?

答案:
模式图(Schema Diagram)是一种图形化表示,用于展示数据库中各个关系(表)及其属性、主
键和外键之间的相互关系。它通常包含以下内容:

实体(表):用矩形表示,标明表名。

属性:列出每个表的字段,通常用椭圆或列表的形式展示。

主键和外键:通过下划线或箭头等符号表示主键(Primary Key)和外键(Foreign Key)。

作用:
可视化设计:帮助设计者直观地理解和规划数据库结构。

关系展示:清晰地展示表与表之间的关联,便于识别和管理外键关系。

沟通工具:作为设计文档的一部分,便于团队成员之间的交流和协作。

解析: 模式图是数据库设计的重要工具,通过图形化的方式展示数据库结构,便于理解和优化。

第三章 初级SQL
选择题

7. 在SQL中,哪个关键字用于修改表的结构,例如添加新列?
A. ALTER
B. MODIFY
C. CHANGE
D. UPDATE

答案: A

解析: ALTER 关键字用于修改数据库对象的结构,如表的结构,可以添加、删除或修改列等操作。


MODIFY 和 CHANGE 在某些数据库中可能作为 ALTER 的子句使用,但主要命令是 ALTER 。

填空题

8. 在SQL的SELECT语句中,用于过滤分组后的数据的子句是__。

答案: HAVING

解析: HAVING 子句用于对 GROUP BY 之后的结果进行过滤,它可以基于聚合函数的结果来筛选分


组后的数据。与之不同, WHERE 子句用于在分组之前对数据进行过滤。

简答题

9. 解释SQL中的NULL值及其在查询中的特殊处理方式。

答案:

NULL值的定义: 在SQL中,NULL表示缺失或未知的数据值。它不同于零、空字符串或其他
具体的值,是一种特殊的标记。

NULL值的处理:

逻辑比较: 与NULL值进行任何比较(例如 = , <> , > , < )的结果都是UNKNOWN,因


为NULL代表未知。

IS NULL 和 IS NOT NULL: 用于检查值是否为NULL。常用在WHERE子句中,如


WHERE column IS NULL 。

聚合函数: 大多数聚合函数(如 COUNT、SUM、AVG)会忽略NULL值,除非特别指


定。

三值逻辑: SQL使用三值逻辑(TRUE、FALSE、UNKNOWN)来处理包含NULL值的逻
辑表达式。

解析: NULL值在SQL中具有独特的处理规则,理解其含义和应用场景对于编写正确的查询至关重
要。
第四章 中级SQL
选择题

10. 在SQL中,哪种连接保证返回左表中的所有记录,即使在右表中没有匹配的记录?
A. 内连接
B. 左外连接
C. 右外连接
D. 全外连接

答案: B

解析: 左外连接(LEFT OUTER JOIN)返回左表中的所有记录,即使在右表中没有匹配的记录。没


有匹配的右表记录部分将以NULL填充。

填空题

11. 在SQL中,用于在一个子查询中定义临时命名结果集的子句是__。

答案: WITH

解析: WITH 子句(也称为公用表表达式,CTE)用于在查询中定义临时的结果集,可以在主查询


中多次引用,简化复杂查询的编写。

简答题

12. 解释物化视图(Materialized View)与普通视图(View)的区别及其优缺点。

答案:

普通视图(View):

定义: 普通视图是基于基础表的虚拟表,不存储实际数据。

特点: 每次查询视图时,数据库会动态生成结果集。

优点: 节省存储空间,实时反映基础表的最新数据。

缺点: 复杂查询可能导致性能下降,因为每次访问都需要重新计算。

物化视图(Materialized View):

定义: 物化视图是存储了查询结果的实际视图,通过定期刷新保持与基础表数据的一致
性。

特点: 存储实际数据,提供更快的查询性能。

优点: 提高查询速度,适用于需要频繁访问的复杂查询结果。

缺点: 占用额外的存储空间,维护和刷新时需要额外的资源,数据可能不完全实时。

解析: 物化视图通过预先存储查询结果提升查询性能,但需要权衡存储空间和维护成本。而普通视
图则灵活但可能在复杂查询时性能不佳。
第五章 高级SQL
选择题

13. 在SQL中,触发器(Trigger)可以在以下哪个事件发生时自动执行?
A. 数据库启动
B. 表结构修改
C. 数据的插入、更新或删除
D. 用户登录

答案: C

解析: 触发器(Trigger)是在特定事件(如插入、更新或删除)发生时自动执行的预定义操作,用
于维护数据完整性或执行业务逻辑。

填空题

14. 在SQL中,用户权限控制的命令为__,用于授予用户对数据库对象的访问权限。

答案: GRANT

解析: GRANT 命令用于授予用户或角色对数据库对象(如表、视图、存储过程)的访问权限,如


SELECT、INSERT、UPDATE等。

简答题

15. 什么是视图更新(View Updatability),哪些条件下视图是可更新的?

答案:

视图更新定义: 视图更新指的是能够通过视图对基础表进行插入、删除或更新操作。并非所有
视图都是可更新的,只有满足特定条件的视图才能进行数据修改。

视图可更新的条件:

视图包含基础表的主键或唯一键。

视图不包含聚合函数(如SUM、COUNT等)。

视图不包含DISTINCT关键字。

视图不涉及多个基础表的连接。

视图不包含子查询。

视图中每个可更新的列映射到基础表中的一个可更新的列。

不可更新视图的例子:

包含GROUP BY或HAVING子句的视图。

包含UNION、INTERSECT或EXCEPT操作的视图。

包含聚合函数或计算列的视图。

解析: 视图更新的可行性取决于视图的定义是否能够明确地映射到基础表的具体操作,仅满足简单
映射的视图是可更新的。
第六章 形式化关系查询语言
选择题

16. 在关系代数中,哪种运算用于从关系中选择满足特定条件的元组?
A. 投影运算
B. 选择运算
C. 连接运算
D. 并运算

答案: B

解析: 选择运算(Selection)用于从关系中筛选出满足特定条件的元组,符号通常为σ。

填空题

17. 在关系代数中,两个关系进行笛卡尔积运算时,结果关系的属性数目等于__。

答案: 两个关系的属性数目之和

解析: 笛卡尔积(Cartesian Product)将两个关系的每一个元组合并,结果关系的属性数目是两个


原始关系属性数目的总和。

简答题

18. 什么是域关系演算(Domain Relational Calculus),它与元组关系演算(Tuple Relational


Calculus)有何不同?

答案:

域关系演算(Domain Relational Calculus, DRC): 是一种基于变量的查询语言,变量代


表关系中属性的域。查询通过指定属性的条件来描述所需的数据。

元组关系演算(Tuple Relational Calculus, TRC): 是另一种基于变量的查询语言,变量代


表整个关系中的元组。查询通过指定元组的条件来描述所需的数据。

主要区别:

变量的含义: DRC中的变量表示单个属性值,TRC中的变量表示整个元组。

表达方式: DRC更加关注属性级的条件,TRC更侧重于元组级的条件。

使用场景: 两者在表达能力上是等价的,但在具体应用时可能因表达习惯而有所不同。

解析: 域关系演算和元组关系演算都是关系模型的形式化查询语言,主要区别在于变量的含义和查
询的表达方式,但在表达能力上没有区别。

第七章 数据库设计和E-R模型
选择题

19. 在E-R模型中,用于表示实体集之间多对多关系的要素是:
A. 实体
B. 属性
C. 联系集
D. 键

答案: C
解析: 联系集(Relationship Set)用于表示不同实体集之间的联系。对于多对多关系,一个联系
集连接两个或多个实体集,并且该联系集本身可能包含属性。

填空题

20. 在E-R图中,用于表示属性属于实体或联系的几何图形是__。

答案: 椭圆

解析: 在E-R图中,实体通常用矩形表示,属性用椭圆表示,实体与属性通过直线连接。联系也用
菱形表示,联系的属性同样用椭圆表示。

简答题

21. 解释弱实体集(Weak Entity Set)及其在E-R模型中的应用。

答案:

弱实体集定义: 弱实体集是指在E-R模型中,不能仅通过自身的属性唯一标识实体的实体集。
它依赖于另一个(强)实体集,通过部分键(Partial Key)和与之相关的联系来唯一标识。

特点:

缺乏主键: 弱实体没有足够的属性来作为主键,必须依赖于其相关的强实体集。

部分键: 具有部分键(Discriminator),用来与其强实体集结合唯一标识每个弱实体。

存在联系: 通常通过“依赖于”联系(Identifying Relationship)与强实体集关联。

应用场景: 如“订单项”依赖于“订单”,一个订单可能包含多个订单项,订单项不能独立存在,
必须依赖于具体的订单。

解析: 弱实体集用于建模那些生命周期依赖于其他实体集的实体,通过与强实体集的联系和部分键
来唯一标识,确保数据的完整性和关联性。

第八章 关系数据库设计
选择题

22. 在数据库规范化中,第三范式(3NF)解决了什么问题?
A. 重复数据
B. 部分依赖
C. 传递依赖
D. 多重依赖

答案: C

解析: 第三范式(3NF)消除了传递依赖,即非主属性不应依赖于其他非主属性,从而减少数据冗
余和更新异常。

填空题

23. Boyce-Codd范式的简称是__。

答案: BCNF

解析: Boyce-Codd范式(Boyce-Codd Normal Form, BCNF)是一种比第三范式更严格的规范化


形式,用于消除所有的函数依赖异常,确保数据库设计的高质量。
简答题

24. 什么是无损分解(Lossless Decomposition),为什么在数据库设计中重要?

答案:

无损分解定义: 无损分解(Lossless Decomposition)是指将一个关系分解成多个子关系


后,通过自然连接这些子关系能够恢复原始关系,而不会丢失任何信息。

重要性:

数据完整性: 确保数据在分解和重组过程中不丢失,维护数据的一致性和完整性。

避免冗余: 通过合理的分解,减少数据冗余,优化存储。

便于维护: 规范化分解使得数据库结构更清晰,便于管理和维护。

解析: 无损分解是数据库规范化过程中必须满足的性质,确保数据分解后仍然能够完全恢复,避免
数据丢失。

第十章 存储和文件结构
选择题

25. RAID 0级别主要提升数据库系统的哪方面性能?


A. 数据冗余
B. 数据可靠性
C. 数据读取和写入速度
D. 数据加密

答案: C

解析: RAID 0通过条带化(Striping)将数据分布存储在多个磁盘上,从而提高数据的读取和写入


速度,但不提供数据冗余和容错能力。

填空题

26. RAID 1级别通过__来提高数据的可靠性和可用性。

答案: 镜像

解析: RAID 1通过将数据完整地复制到多个磁盘上(镜像),实现数据冗余,提升数据的可靠性和


可用性。当一个磁盘故障时,另一个磁盘上的数据仍然可用。

简答题

27. 什么是多级索引(Multilevel Index),它如何提高索引的查询效率?

答案:

多级索引定义: 多级索引是指在一个索引结构中使用多个层次的索引,每一层都是上一层的索
引,从而实现更高效的查询。

工作原理:

1. 顶层索引(如一级索引): 指向二级索引的条目。

2. 中间层索引(如二级索引): 进一步指向更低层的索引或实际数据块。

3. 底层索引(如三级索引): 直接指向实际的数据存储位置。
提高查询效率的原因:

减少磁盘访问次数: 通过分层次的索引,能够快速定位到目标数据的具体位置,避免全
表扫描。

支持大规模数据集: 多级索引适用于非常大的数据集,能够有效地管理和查询海量数
据。

解析: 多级索引通过分层组织索引结构,减少每次查询所需的磁盘访问次数,从而显著提高查询效
率,尤其在处理大规模数据时效果尤为明显。

第十一章 索引与散列
选择题

28. 在关系数据库中,覆盖索引(Covering Index)的特点是:


A. 索引包含所有查询所需的列
B. 索引仅包含主键
C. 索引是稀疏的
D. 索引支持多列

答案: A

解析: 覆盖索引(Covering Index)是指索引中包含了查询所需的所有列,因此查询时只需访问索


引而无需回表访问实际数据,提高查询性能。

填空题

29. 位图索引(Bitmap Index)特别适用于__的列。

答案: 低基数(低种类数)的列

解析: 位图索引适用于基数较低的列(如性别、布尔值等),因为它通过位向量高效地表示各个值
的存在性,适合快速进行多维查询和数据分析。

简答题

30. 解释静态散列(Static Hashing)与动态散列(Dynamic Hashing)的区别及适用场景。

答案:

静态散列(Static Hashing):

定义: 使用固定数量的桶(bucket)进行散列,散列函数在整个数据库生命周期内保持
不变。

优点: 实现简单,访问速度快。

缺点: 难以应对数据量的动态变化,容易导致桶溢出或空间浪费。

适用场景: 数据量相对固定且变化不大的环境。

动态散列(Dynamic Hashing):

定义: 允许在需要时动态地增加或减少散列桶的数量,以适应数据量的变化。

优点: 更具灵活性,能够高效处理动态变化的数据量,减少溢出。

缺点: 实现较为复杂,需要管理桶的分裂和合并。

适用场景: 数据量经常变化,需要高效应对插入和删除操作的环境。
解析: 静态散列适用于数据量相对稳定的场景,而动态散列则适用于需要频繁调整存储结构以应对
数据量变化的环境,是根据具体需求选择的关键技术。

第十二章 查询处理
选择题

31. 在数据库查询处理中,哪种连接算法通常在较小的关系作为外部循环更为高效?
A. 嵌套循环连接
B. 块嵌套循环连接
C. 合并连接
D. 哈希连接

答案: A

解析: 嵌套循环连接(Nested Loop Join)在外部关系较小且内部关系有有效索引时通常更为高


效。因为可以减少内部循环的次数,特别适用于外部关系较小的情况。

填空题

32. 外部排序归并算法的主要步骤包括__和__。

答案: 分割(分批排序)、合并

解析: 外部排序归并算法主要包括将大数据集分割成适合内存处理的小块,分别在内存中排序,然
后将这些已排序的小块合并成最终的有序数据集。

简答题

33. 什么是表达式计算中的流水线(Pipelining),它如何提高查询处理的效率?

答案:

流水线定义: 流水线(Pipelining)是一种查询处理技术,通过将操作分解为多个阶段,每个
阶段独立执行并且可以并行处理多个查询的不同部分,从而实现操作的重叠执行。

工作原理:

各个操作(如选择、投影、连接)被拆分成多个阶段。

系统允许前一个阶段的输出立即供下一个阶段使用,同时从上游操作中获取新的输入。

各个阶段可以并行处理多个数据流,提高整体吞吐量。

提高效率的原因:

减少等待时间: 各个阶段可以同时处理不同的数据,提高资源利用率。

提高吞吐量: 允许多个操作重叠进行,加快查询处理速度。

解析: 流水线通过并行处理不同阶段的操作,将多道操作的执行时间重叠,从而显著提高查询处理
的效率,尤其在处理复杂查询时效果明显。
第十三章 查询优化
选择题

34. 在查询优化中,等价规则的作用是:
A. 替换查询语句中的关键字
B. 改变查询语句的结构以生成等效的不同执行计划
C. 分析查询结果的准确性
D. 优化数据库的存储结构

答案: B

解析: 等价规则(Equivalence Rules)用于在保持查询逻辑相同的前提下,改变查询语句的结构,


生成不同的执行计划,以便优化器选择最优的执行路径。

填空题

35. 基于成本的查询优化器主要依据__来评估不同执行计划的优劣。

答案: 执行代价

解析: 基于成本的查询优化器通过估算不同执行计划的执行代价(如I/O操作次数、CPU消耗
等),选择代价最低的执行计划作为最终的查询执行方案。

简答题

36. 什么是选择性的估计(Selectivity Estimation),它在查询优化中的作用是什么?

答案:

选择性定义: 选择性估计是指预测查询中使用的选择条件(如WHERE子句)的过滤效果,即
满足条件的元组比例或数量。

作用:

成本估算: 通过估计选择性,优化器可以预测不同执行计划的中间结果规模,从而准确
估算执行代价。

执行计划选择: 选择性信息帮助优化器决定采用哪种连接顺序、哪种算法(如嵌套循环
连接、哈希连接)最为高效。

索引使用决策: 高选择性的条件更适合使用索引,而低选择性条件可能更适合全表扫
描。

解析: 选择性估计是查询优化中的关键因素,准确的估计能够显著提升执行计划的质量和查询性
能。

第十四章 事务
选择题

37. 在事务的ACID特性中,哪个特性保证即使系统发生崩溃,已经提交的事务的结果也不会丢失?
A. 原子性
B. 一致性
C. 隔离性
D. 持久性

答案: D
解析: 持久性(Durability)确保一旦事务提交,其结果将被永久保存,即使系统发生故障或崩
溃,已提交的数据也不会丢失。

填空题

38. 在事务处理中,用于确保事务对数据库的更改在提交后不会丢失的属性是__。

答案: 持久性

解析: 持久性(Durability)是ACID四大特性的其中之一,确保一旦事务提交,其对数据库所做的
更改将永久保留,即使系统发生崩溃也不会丢失。

简答题

39. 请解释可串行化(Serializable)隔离级别的含义及其对事务执行的影响。

答案:

可串行化定义: 可串行化是最高的事务隔离级别,保证并发事务的执行效果与这些事务按某种
顺序串行执行的结果相同。即,虽然事务是并发执行的,但其结果与顺序执行一致,避免了所
有并发引起的问题。

影响:

数据一致性: 确保数据的一致性和完整性,没有幻读、脏读和不可重复读等问题。

并发性能: 由于需要严格的锁定机制,可能导致较高的锁竞争,降低系统的并发性能。

实现复杂性: 实现可串行化需要复杂的并发控制协议,如两阶段锁定协议,增加系统的
实现难度。

解析: 可串行化隔离级别通过严格的并发控制确保事务执行的正确性和一致性,但可能对系统的并
发性能带来一定影响,是在需要高数据一致性的场景下使用的关键特性。

第十五章 并发控制
选择题

40. 在基于锁的并发控制协议中,两阶段封锁协议(2PL)要求事务在释放任何锁之前必须完成__。
A. 所有的锁请求
B. 所有的锁释放
C. 所有的锁获取
D. 部分锁获取

答案: C

解析: 两阶段封锁协议(Two-Phase Locking)要求事务在进入收缩阶段之前,必须完成所有锁的


获取(扩展阶段),一旦开始释放锁(收缩阶段),就不能再获取新的锁。

填空题

41. 在并发控制中,能够检测出死锁并采取措施恢复的是__方法。

答案: 死锁检测

解析: 死锁检测方法通过定期检查资源分配图或等待图来识别系统中的死锁,然后通过撤销某些事
务或回滚操作来恢复系统的正常运行。
简答题

42. 什么是多粒度锁定(Multigranularity Locking),它如何提高并发控制的效率?

答案:

多粒度锁定定义: 多粒度锁定是一种锁管理策略,允许在不同粒度(如数据库、表、页、记
录)上进行锁定,从而实现灵活的并发控制。

实现方式:

层次锁定: 锁定粒度不同的资源层次结构,如数据库 > 表 > 页 > 记录。

锁兼容性: 不同粒度的锁具有兼容性规则,确保不会因锁粒度不当而导致不必要的阻
塞。

提高效率的方式:

减少锁冲突: 通过在适当粒度上加锁,减少不必要的锁竞争,提高并发性。

支持部分资源锁定: 允许事务只锁定所需的数据部分,而不是整个表,提升系统的并发
吞吐量。

灵活性: 根据事务的需求动态调整锁粒度,优化资源的使用和访问效率。

解析: 多粒度锁定通过提供不同层次的锁,既保证了数据的一致性,又提升了并发性,是现代数据
库并发控制中的重要技术。

第十六章 恢复系统
选择题

43. 在数据库恢复过程中,使用日志来撤销未提交的事务操作的过程称为:
A. 重做(Redo)
B. 撤销(Undo)
C. 回滚(Rollback)
D. 恢复(Recover)

答案: B

解析: 在数据库恢复过程中,撤销(Undo)操作用于撤销那些未提交事务所做的更改,以确保数
据库保持一致性。重做(Redo)则用于重新执行已提交事务的操作。

填空题

44. 在数据库恢复中,检查点(Checkpoint)用于减少恢复过程中需要读取的日志量,以提高恢复速
度。

答案: 正确

解析: 检查点(Checkpoint)记录了数据库某一时刻的状态,以及在此时之前所有已提交事务的日
志信息。通过这种方式,恢复时可以从最近的检查点开始,减少需要回溯和重做的日志量,从而提
高恢复速度。
简答题

45. 什么是多版本机制(Multiversion Concurrency Control),它如何提高数据库的并发性能?

答案:

多版本机制定义: 多版本并发控制(Multiversion Concurrency Control, MVCC)通过为数据


库中的每个数据项维护多个版本,允许读操作访问旧版本数据,而写操作可以创建新版本,避
免读写冲突。

工作原理:

版本管理: 每个数据项维护多个版本,并标记每个版本的创建和过期时间。

读操作: 读事务根据其时间戳访问适当版本的数据,无需等待写锁释放。

写操作: 写事务创建新的数据版本,不影响正在进行的读事务。

提高并发性能的方式:

减少锁竞争: 读操作不需要锁定资源,避免与写操作的锁竞争,提高并发性。

提高吞吐量: 允许更多的事务同时执行,提升系统的整体吞吐量。

提高响应速度: 读操作无需等待锁释放,可以更快地响应用户请求。

解析: 多版本机制通过允许多个版本的数据共存,减少读写冲突,显著提高数据库的并发性能和系
统的整体效率。

综合题
综合题

46. 设计一个简单的图书馆管理系统,包括以下实体和联系:图书(Book)、读者(Reader)、借阅
(Borrow)。请绘制其E-R图,并转换为关系模式,说明每个关系的主键和外键。

答案:

设计过程:

实体集:

图书(Book):

属性: ISBN(主键)、书名、作者、出版社、价格

读者(Reader):

属性: ReaderID(主键)、姓名、地址、联系电话

联系集:

借阅(Borrow):

属性: BorrowDate、ReturnDate

联系性质: 多对多,一个读者可以借阅多本图书,一本图书也可以被多位读者借
阅。

E-R图描述:

实体集矩形: Book、Reader

属性椭圆:

Book: ISBN、书名、作者、出版社、价格

Reader: ReaderID、姓名、地址、联系电话
Borrow: BorrowDate、ReturnDate
联系集菱形: Borrow

联系基数: Book与Borrow为一对多,Reader与Borrow为一对多

转换为关系模式:

1. Book(ISBN, Title, Author, Publisher, Price)

主键: ISBN

2. Reader(ReaderID, Name, Address, Phone)

主键: ReaderID

3. Borrow(ReaderID, ISBN, BorrowDate, ReturnDate)

主键: (ReaderID, ISBN, BorrowDate)

外键:

ReaderID引用Reader(ReaderID)

ISBN引用Book(ISBN)

解析:
通过E-R图设计,明确了各实体及其属性、实体之间的联系及基数关系。转换为关系模式时,主键和
外键的定义确保了数据的唯一性和参照完整性,支持图书馆管理系统的基本功能。

案例分析题目 1
题目:

假设有一个银行数据库系统,其中有一个 Accounts 表,结构如下:

AccountID Balance

1 1000

2 1500

两个交易 T1 和 T2 同时执行以下操作:

交易 T1:

1. 读取 AccountID = 1 的 Balance (假设读取到余额为 1000)。

2. 从该账户中扣除 100,更新 Balance 为 900。

3. 提交事务。

交易 T2:

1. 读取 AccountID = 1 的 Balance (假设读取到余额为 1000)。

2. 向该账户中存入 200,更新 Balance 为 1200。

3. 提交事务。

问题:
1. 在使用 读未提交(Read Uncommitted) 隔离级别的情况下,最终 AccountID = 1 的
Balance 可能是多少?请说明可能出现的情况。

2. 在使用 可重复读(Repeatable Read) 隔离级别的情况下,上述两笔交易能否成功执行?最终


AccountID = 1 的 Balance 应为多少?

3. 解释出现的问题,并说明如何通过 两阶段锁定协议(Two-Phase Locking, 2PL) 来解决类似的并


发问题。

答案:

问题 1:使用读未提交(Read Uncommitted)隔离级别的最终余额

可能的情况:

在 读未提交 隔离级别下,交易 T2 可以读取到 T1 尚未提交的更改。这可能导致以下两种主要情况:

1. 情况 A:顺序执行

T1 先执行:

读取余额为 1000,更新为 900。

提交事务。

T2 后执行:

读取余额为 900,更新为 1100。

提交事务。

最终余额: 1100

2. 情况 B:交叉执行

T1 执行第1步,读取余额为 1000。

T2 执行:

读取余额为 1000( T1 尚未提交)。

更新余额为 1200。

提交事务。

T1 执行第2步,更新余额为 900。

T1 提交事务。

最终余额: 900

总结:

在 读未提交 隔离级别下,由于 T2 可能读取到 T1 的未提交数据(脏读),导致最终余额可能为 900 或


1100,这取决于事务的执行顺序。

问题 2:使用可重复读(Repeatable Read)隔离级别的最终余额

解释:

在 可重复读 隔离级别下,一个事务在其开始时获取的数据快照不会被其他事务的更改所影响。这意味
着:

T1 和 T2 都会在开始时读取到数据库的相同快照,即 Balance = 1000 。


当 T1 尝试更新 Balance 为 900 时,会获取到 AccountID = 1 的排他锁。

T2 在尝试更新 Balance 时,会被阻塞,直到 T1 提交。

因此,交易 T2 会读取 Balance = 900 ( T1 提交后的值),然后更新为 1100 。

执行顺序:

1. T1 读取 Balance = 1000 。

2. T1 更新 Balance = 900 。

3. T1 提交事务。

4. T2 读取 Balance = 900 (因为 T1 已提交)。

5. T2 更新 Balance = 1100 。

6. T2 提交事务。

最终余额: 1100

问题 3:问题解释与两阶段锁定协议的解决方案

出现的问题:

在 读未提交 隔离级别下,存在 脏读 问题,即一个事务可以读取到另一个事务尚未提交的更改,导致数


据不一致。具体表现为交易 T2 可能基于 T1 的未提交更改进行操作,最终导致余额错误。

两阶段锁定协议(2PL)解决方案:

两阶段锁定协议(2PL) 是一种确保事务按顺序安全执行的并发控制机制,分为两个阶段:

1. 扩展阶段(Growing Phase):

事务可以申请并获得所有需要的锁(共享锁或排他锁),但不能释放任何锁。

2. 收缩阶段(Shrinking Phase):

事务释放锁但不能再申请新的锁。

应用于本案例:

交易 T1:

1. 扩展阶段:

获取 AccountID = 1 的排他锁。

读取 Balance = 1000 。

更新 Balance 为 900。

2. 收缩阶段:

提交事务,释放锁。

交易 T2:

1. 扩展阶段:

尝试获取 AccountID = 1 的排他锁,但因 T1 已持有锁, T2 被阻塞。

2. 收缩阶段:

一旦 T1 提交并释放锁, T2 获得锁。

读取 Balance = 900 ( T1 的更新值)。


更新 Balance 为 1100。

提交事务,释放锁。

结果:

通过 2PL,事务 T2 在 T1 完成并提交后才能进行操作,避免了 T2 基于 T1 的未提交数据进行更改,


从而防止了脏读问题,确保了最终余额的正确性(1100)。

案例分析题目 2
题目:

在一个在线购物系统中,有两个事务 T1 和 T2 同时执行以下操作:

交易 T1:

1. 查询商品 A 的库存数量(假设库存为 10)。

2. 如果库存 >= 5,则扣减库存 5。

3. 提交事务。

交易 T2:

1. 查询商品 A 的库存数量(假设库存为 10)。

2. 如果库存 >= 7,则扣减库存 7。

3. 提交事务。

假设系统采用 可串行化(Serializable) 隔离级别进行并发控制,并使用 两阶段锁定协议(2PL)。

问题:

1. 根据可串行化隔离级别,交易 T1 和 T2 可能的执行顺序是什么?请列举所有可能的序列并说明最
终商品 A 的库存数量。

2. 如果系统没有采用任何并发控制机制,上述两笔交易执行可能导致的最终库存数量有哪些?说明原
因。

3. 解释可串行化隔离级别和两阶段锁定协议如何防止上述并发问题的发生。

答案:

问题 1:可串行化隔离级别下的执行顺序及最终库存

可串行化隔离级别的要求:

事务的并发执行效果等价于某种顺序的串行执行,且不会引发并发问题(如脏读、不可重复读、幻读
等)。

可能的执行顺序及结果:

1. 执行顺序 A: T1 → T2

T1 执行:
1. 查询库存为 10。

2. 扣减库存 5,库存变为 5。

3. 提交事务。
T2 执行:
1. 查询库存为 5。

2. 检查库存是否 >= 7,条件不满足,库存不变。

3. 提交事务。

最终库存: 5
2. 执行顺序 B: T2 → T1

T2 执行:
1. 查询库存为 10。

2. 扣减库存 7,库存变为 3。

3. 提交事务。

T1 执行:
1. 查询库存为 3。

2. 检查库存是否 >= 5,条件不满足,库存不变。

3. 提交事务。

最终库存: 3

总结:

在 可串行化 隔离级别下, T1 和 T2 的执行相当于两种严格的串行顺序,最终库存可能为 5 或 3,具体


取决于事务的执行顺序。

问题 2:无并发控制机制下的可能库存数量

可能的情况:

在没有任何并发控制机制的情况下, T1 和 T2 可能并发执行,导致数据竞态和不一致。下面列举几种可
能的执行序列及其结果:

1. 交叉执行序列 A:

T1 执行第1步: 查询库存为 10。

T2 执行第1步: 查询库存为 10。


T1 执行第2步: 扣减库存5,库存变为 5。
T2 执行第2步: 检查库存是否 >=7(基于读取的10),条件满足,扣减7,库存变为 -2。
T1 和 T2 提交。
最终库存: -2

2. 交叉执行序列 B:

T1 执行第1步: 查询库存为 10。


T1 执行第2步: 扣减库存5,库存变为 5。

T2 执行第1步: 查询库存为 5。
T2 执行第2步: 检查库存是否 >=7,条件不满足,库存不变。
最终库存: 5

3. 交叉执行序列 C:
T2 执行第1步: 查询库存为 10。
T2 执行第2步: 扣减库存7,库存变为 3。
T1 执行第1步: 查询库存为 3。

T1 执行第2步: 检查库存是否 >=5,条件不满足,库存不变。


最终库存: 3

总结:

在没有并发控制的情况下,最终库存可能为 -2、5 或 3。其中,-2 是由于 脏写 和 数据竞态 导致的非法


库存值。

问题 3:可串行化隔离级别和两阶段锁定协议的作用

可串行化隔离级别:

定义: 可串行化是最高级别的事务隔离,确保并发执行的事务的结果等价于某种串行执行的结果。

作用:

防止并发问题: 如脏读、不可重复读和幻读。

数据一致性: 确保所有事务的执行不会导致数据不一致。

两阶段锁定协议(2PL):

定义: 2PL 是一种并发控制方法,事务在执行过程中分为两个阶段:

1. 锁获取阶段(Growing Phase): 事务可以申请并持有锁,但不能释放锁。

2. 锁释放阶段(Shrinking Phase): 事务开始释放锁,并且不能再申请新的锁。

作用:

保证串行化: 通过严格的锁获取和释放顺序,确保事务执行的串行化等价性。

避免并发冲突: 通过锁机制,防止多个事务同时修改相同的数据,避免数据竞态和不一致。

在本案例中的应用:

锁的使用:

当 T1 开始查询库存时,会对 AccountID = 1 的 Balance 加上共享锁(S锁)。

如果 T1 需要更新余额,则升级为排他锁(X锁)。

T2 在尝试读取或修改相同数据时,会因锁的存在而被阻塞,直到 T1 释放锁。

执行顺序保障:

通过 2PL,如果 T1 在执行 SELECT 后申请并持有 X锁 , T2 无法进行、只能等待 T1 完成


后再执行。

这样,事务 T2 只能在 T1 提交后,根据更新后的余额(5 或 3)进行操作,避免了脏写和数


据竞态。

结果保障:

通过 可串行化隔离级别 和 2PL,确保 T1 和 T2 的操作按某种串行顺序执行,避免了不一致的最


终余额(如 -2)。

最终库存只能是 5 或 3,符合业务逻辑,防止非法库存值的产生。
案例分析题目 3
题目:

在一个航空预订系统中,数据库包含一个 Flights 表,结构如下:

FlightID SeatsAvailable

F001 100

两个事务 T1 和 T2 同时尝试预订 FlightID = F001 的座位:

交易 T1:

1. 读取 SeatsAvailable (假设读取到 100)。

2. 检查是否有足够座位(>= 50)。

3. 扣减座位 50,更新 SeatsAvailable 为 50。

4. 提交事务。

交易 T2:

1. 读取 SeatsAvailable (假设读取到 100)。

2. 检查是否有足够座位(>= 60)。

3. 扣减座位 60,更新 SeatsAvailable 为 40。

4. 提交事务。

假设系统采用 乐观并发控制(Optimistic Concurrency Control, OCC)。

问题:

1. 描述乐观并发控制下,事务 T1 和 T2 的执行过程。最终 SeatsAvailable 的值将是多少?

2. 如果两个事务都提交而不进行任何冲突检测,最终 SeatsAvailable 的值会是什么?这会导致什么


问题?

3. 解释乐观并发控制如何通过验证阶段避免上述问题,确保数据一致性。

答案:

问题 1:乐观并发控制下 T1 和 T2 的执行过程及最终座位数
乐观并发控制(OCC)简介:

乐观并发控制假设事务通常不会发生冲突,因此允许事务在不加锁的情况下执行,但在提交前进行验证
以确保没有冲突。如果冲突被检测到,事务将被回滚。

执行过程:

1. T1 和 T2 均开始事务并执行操作:

T1 :
1. 读取 SeatsAvailable = 100 。

2. 检查是否有足够座位(100 >= 50),满足条件。

3. 计划扣减座位 50。

T2 :
1. 读取 SeatsAvailable = 100 。

2. 检查是否有足够座位(100 >= 60),满足条件。

3. 计划扣减座位 60。
2. 提交阶段:

T1 提交:
1. 验证阶段:检查在其执行期间, Flights 表的 SeatsAvailable 是否被其他事务修
改。

2. T1 发现没有冲突(假设 T2 尚未提交)。

3. 执行写操作:更新 SeatsAvailable 为 50。

T2 提交:

1. 验证阶段:检查 Flights 表的 SeatsAvailable 是否被其他事务修改。

2. T2 发现 SeatsAvailable 已被 T1 修改(由 100 改为 50)。

3. 冲突被检测到, T2 被回滚。

最终结果:

SeatsAvailable = 50

交易状态:

T1 成功提交。
T2 被回滚。

问题 2:无冲突检测情况下的最终库存及问题

假设: 未进行任何冲突检测,允许事务无序提交。

执行过程:

1. ** T1 执行所有步骤并提交, SeatsAvailable 更新为 50。

2. ** T2 执行所有步骤并提交,基于初始 SeatsAvailable = 100 ,更新 SeatsAvailable 为 40。

最终 SeatsAvailable : 40

出现的问题:

丢失更新(Lost Update): 原本应该是预订 50 加 60 座位,实际只减去了 60 座位,导致预订


50 座位的操作被覆盖或丢失。

数据不一致: 由于并发事务操作不受控制,最终库存可能低于实际需求或超卖。

业务逻辑错误: 座位数被错误扣减,可能导致乘客预订到不存在的座位。

问题 3:乐观并发控制通过验证阶段避免问题的机制

乐观并发控制(OCC)的验证阶段作用:

1. 读取阶段(Read Phase):

事务在执行过程中读取数据,不加锁。

事务记录在读取时的数据版本或时间戳。
2. 验证阶段(Validation Phase):

在事务尝试提交前,系统检查自事务开始以来,所有已读取的数据是否被其他事务修改。

如果检测到数据被修改,事务被判定为冲突,需回滚。

3. 写入阶段(Write Phase):

如果验证通过,事务将写入变更,更新数据。

在本案例中的应用:

T1 执行:
1. 读取 SeatsAvailable = 100 。

2. 计划扣减 50 座位。

3. **提交时,验证 SeatsAvailable 是否仍为 100。

4. 无冲突,执行更新,将 SeatsAvailable 设置为 50。

T2 执行:
1. 读取 SeatsAvailable = 100 。

2. 计划扣减 60 座位。

3. **提交时,验证 SeatsAvailable 是否仍为 100。

4. 验证失败,因为 SeatsAvailable 已被 T1 修改为 50。

5. 冲突被检测到, T2 被回滚。

效果保障:

数据一致性: 通过验证,确保事务在提交前未受其他事务的影响,避免了丢失更新和数据不一致的
问题。

业务逻辑正确性: 确保所有预订操作根据最新的库存进行,防止超卖或错误扣减。

并发性能优化: OCC 不需要在整个事务过程中加锁,适合读多写少的应用场景,减少了锁带来的性


能开销。

案例分析题目 4
题目:

在一个社交媒体平台的数据库中,有两个表: Users 和 Posts 。

Users 表:

UserID UserName PostCount

1 Alice 10

2 Bob 5

Posts 表:

PostID UserID Content

101 1 "Hello World!"


PostID UserID Content

102 1 "Another Post"

103 2 "Bob's Post"

两个事务 T1 和 T2 同时执行以下操作:

交易 T1:

1. 插入一条新帖子 PostID = 104, UserID = 1, Content = "New Post" 到 Posts 表。

2. 更新 Users 表中 UserID = 1 的 PostCount 增加 1。

3. 提交事务。

交易 T2:

1. 插入一条新帖子 PostID = 105, UserID = 1, Content = "Another New Post" 到


Posts 表。

2. 更新 Users 表中 UserID = 1 的 PostCount 增加 1。

3. 提交事务。

假设系统采用 多版本并发控制(Multiversion Concurrency Control, MVCC),并且 PostCount 是


根据 Posts 表中的帖子数自动计算得出的(即,通过触发器或定期计算)。

问题:

1. 在 MVCC 下,如何避免 UserID = 1 的 PostCount 出现错误的最终值?

2. 如果 PostCount 是通过事务内手动计算和更新,且采用 时间戳排序协议(Timestamp Ordering


Protocol),描述可能出现的数据竞争和最终结果。

3. 解释 MVCC 和时间戳排序协议在处理类似并发更新时的不同策略和优劣。

答案:

问题 1:MVCC 下避免 PostCount 错误的策略


MVCC 工作原理:

多版本并发控制(MVCC)通过为每个数据项维持多个版本,允许读事务访问快照数据,而写事务创建新
版本,避免了读写冲突。

处理步骤:

1. 读事务:

T1 和 T2 在插入帖子时,读取 Users 表的快照。

由于 PostCount 是自动计算的(通过触发器或定期计算),每次提交后会重新计算。

2. 写事务:

插入新帖子不直接影响 PostCount ,因为 PostCount 是通过查询 Posts 表自动计算。

更新 PostCount 增加 1 的操作需要确保事务的隔离和一致性。

避免错误的策略:

使用触发器自动更新 PostCount :
在插入新帖子时,触发器自动计算并更新 PostCount ,确保每次插入操作都正确反映在
PostCount 中,无需手动计算。
快照隔离下的版本控制:

每个事务看到的是提交前的快照,确保读取和更新 PostCount 基于一致的数据。

更新操作使用新版本,避免覆盖或丢失其他事务的更新。

最终结果:

无论 T1 和 T2 如何并发执行, PostCount 最终都会正确增加 2(从 10 增至 12),因为每次插


入操作都会触发独立的 PostCount 更新,且 MVCC 保证了事务的一致性。

问题 2:时间戳排序协议下的数据竞争与结果

时间戳排序协议简介:

时间戳排序协议(Timestamp Ordering Protocol)为每个事务分配一个唯一的时间戳,确保所有操作按


照事务的时间戳顺序执行,以避免冲突。

执行过程:

1. 事务时间戳:

假设 T1 的时间戳早于 T2 (TimeStamp(T1) < TimeStamp(T2)`)。

2. 操作顺序:

T1 执行:
1. 插入 PostID = 104 。

2. 读取 PostCount = 10 。

3. 计算 PostCount + 1 = 11 。

4. 更新 PostCount = 11 。

T2 执行:
1. 插入 PostID = 105 。

2. 读取 PostCount (基于 T1 未提交时的快照, PostCount = 10 )。

3. 计算 PostCount + 1 = 11 。

4. 尝试更新 PostCount = 11 。

3. 验证阶段:

T1 提交: 成功,更新 PostCount = 11 。


T2 尝试提交:
检查 PostCount 的最新时间戳,发现 T1 已修改 PostCount ,与 T2 的时间戳不一
致。

T2 被回滚,以维护时间戳顺序。

最终结果:

T1 提交, T2 被回滚。
PostCount 最终值: 11

问题描述:
T2 基于 T1 的初始值进行计算,因时间戳较晚,且 T1 已修改 PostCount ,导致 T2 的更新被拒
绝,避免了丢失更新。

问题 3:MVCC 与时间戳排序协议的比较

MVCC 与时间戳排序协议的策略对比:

1. MVCC(多版本并发控制):

策略: 通过维护数据的多个版本,实现读写操作的并行执行。读事务访问旧版本,写事务创建
新版本。

优点:

高并发性: 读写操作不相互阻塞,提高系统吞吐量。

减少锁竞争: 由于读操作不需要加锁,减少锁冲突。

提升性能: 适用于读多写少的场景,读操作性能高。

缺点:

存储开销: 需要维护多个版本的数据,增加存储需求。

复杂性: 实现和管理多个版本较为复杂。

垃圾回收: 需要机制来清理不再使用的旧版本数据。

2. 时间戳排序协议(Timestamp Ordering Protocol):

策略: 为每个事务分配唯一时间戳,所有操作按时间戳顺序执行,确保事务的串行化。

优点:

严格串行化: 确保事务按时间戳顺序执行,维护数据一致性。

简单性: 实现相对简单,不需要维护多个数据版本。

缺点:

冲突频发: 高并发写操作可能导致频繁的事务回滚,降低系统性能。

事务回滚开销: 回滚事务带来的性能损耗。

不适合读多写少的场景: 阻塞和回滚可能影响读性能。

应用场景对比:

MVCC 适用场景:

读多写少: 如在线阅读平台、报表生成系统等,需要大量并发读操作,少量更新。

高并发环境: 系统需要支持高并发的用户访问,且读操作不应被写操作阻塞。

时间戳排序协议适用场景:

写操作频繁: 如实时交易系统,需要严格的事务顺序,且容忍一定频繁回滚。

事务执行时间短: 回滚开销较小,能够快速重新执行被回滚的事务。

总结:

MVCC 通过数据版本化提供高并发读写性能,适用于读多写少的系统,但增加了存储和管理复杂
性。

时间戳排序协议 提供严格的事务串行化,适用于写操作频繁且事务短小的系统,但可能在高并发写
环境下引发频繁回滚,影响性能。
案例分析题目 5
题目:

在一个医院管理系统中,数据库包含一个 Medicine 表,结构如下:

MedicineID MedicineName Stock

M001 Aspirin 500

两个事务 T1 和 T2 同时执行以下操作:

交易 T1:

1. 查询 MedicineID = M001 的 Stock (读取到 500)。

2. 销售 100 单位药品,更新 Stock 为 400。

3. 提交事务。

交易 T2:

1. 查询 MedicineID = M001 的 Stock (读取到 500)。

2. 退货 50 单位药品,更新 Stock 为 550。

3. 提交事务。

假设系统采用 基于锁的两阶段锁定协议(2PL),且使用 严格两阶段锁定(Strict 2PL)。

问题:

1. 详细描述 T1 和 T2 在 严格两阶段锁定 下获取和释放锁的过程。

2. 最终 MedicineID = M001 的 Stock 会是多少?解释锁的作用如何防止数据不一致。

3. 如果采用 非严格两阶段锁定,描述可能出现的最终 Stock 数值,并解释原因。

答案:

问题 1: T1 和 T2 在严格两阶段锁定 (Strict 2PL) 下获取和释放锁的过程


严格两阶段锁定(Strict 2PL)简介:

严格两阶段锁定要求事务在持有任何排他锁(X锁)时,不得释放任何锁,直到事务完全提交或回滚。这
确保了所有对数据的修改在事务结束前对其他事务不可见,防止了读-已提交脏数据。

执行过程:

1. 事务时间线:

T1 和 T2 同时开始。
2. T1 执行步骤:

1. 获取共享锁(S锁):

读取 Stock = 500 , T1 获取 M001 的共享锁。

2. 升级为排他锁(X锁):

需要更新 Stock , T1 升级 M001 的锁类型为排他锁。

如果 T2 已持有共享锁,则 T1 需等待,反之无阻碍。
3. 更新 Stock : 将 Stock 更新为 400。

4. 提交事务:

T1 释放 M001 的排他锁。
3. T2 执行步骤:

1. 获取共享锁(S锁):

读取 Stock = 500 , T2 获取 M001 的共享锁。

如果 T1 已持有共享锁,则 T2 也可以持有,同时获取共享锁。

2. 升级为排他锁(X锁):

需要更新 Stock , T2 升级 M001 的锁类型为排他锁。

如果 T1 已持有排他锁,则 T2 需等待,反之无阻碍。

3. 更新 Stock : 将 Stock 更新为 550。

4. 提交事务:

T2 释放 M001 的排他锁。

锁获取与释放顺序:

锁获取:

T1 和 T2 各自先获取 共享锁,然后请求 排他锁。


锁释放:

严格2PL 要求在提交后释放锁,因此 T1 和 T2 必须在完成所有操作后才释放锁。

可能的执行顺序:

如果 T1 先获取排他锁并提交, T2 执行后则基于更新后的 Stock = 400 进行操作。

如果 T2 先获取排他锁并提交, T1 执行后则基于更新后的 Stock = 550 进行操作。

如果同时请求排他锁,系统会根据锁请求的顺序或优先级决定哪个事务先执行,另一个事务需等
待。

问题 2:最终 Stock 的值及锁的作用


可能的执行顺序及结果:

1. 执行顺序 A: T1 → T2

T1 执行:
1. 读取 Stock = 500 ,获取共享锁。

2. 请求并获取排他锁,更新 Stock 至 400。

3. 提交事务,释放锁。

T2 执行:
1. 读取 Stock = 400 ,获取共享锁。

2. 请求并获取排他锁,检查是否有足够库存(400 >= 60)。

3. 更新 Stock 至 340。

4. 提交事务,释放锁.

最终 Stock : 340
2. 执行顺序 B: T2 → T1

T2 执行:
1. 读取 Stock = 500 ,获取共享锁。

2. 请求并获取排他锁,更新 Stock 至 550。

3. 提交事务,释放锁。

T1 执行:
1. 读取 Stock = 550 ,获取共享锁。

2. 请求并获取排他锁,更新 Stock 至 450。

3. 提交事务,释放锁.

最终 Stock : 450

锁的作用:

排他锁的排他性: 通过 严格2PL,一个事务在持有排他锁时,阻止其他事务读取和修改相同的数
据,从而确保事务的隔离性和数据的一致性。

防止丢失更新: 锁机制确保了事务按序执行,避免了多个事务基于同一初始值进行更新,防止了数
据的不一致和丢失。

问题 3:严格两阶段锁定与非严格两阶段锁定的区别及其影响

严格两阶段锁定(Strict 2PL):

定义: 定义为事务在持有的所有排他锁直到事务结束(提交或回滚)后才释放锁。

影响:

优势:

避免不可撤销的脏写: 确保只有在事务完成后,其他事务才能访问或修改数据。

维护数据一致性: 严格的锁释放顺序确保数据的一致性和隔离性。

劣势:

潜在的锁等待与死锁: 随着锁持有时间延长,增加了发生死锁的可能。

降低并发性: 锁持有至事务结束,可能阻塞其他事务的执行。

非严格两阶段锁定(Non-Strict 2PL):

定义: 事务在获取和释放锁时不严格遵循锁释放的阶段,允许在事务进行中释放排他锁。

影响:

优势:

提高并发性: 锁可以在事务中间释放,减少锁持有时间,提升系统的并发能力。

减少死锁概率: 短时间持有锁降低了死锁发生的机会。

劣势:

可能的不可撤销的更新(Dirty Write): 如果一个事务释放了排他锁,另一个事务可能


基于未提交的数据进行读取和更新,导致数据不一致。

复杂性增加: 需要更复杂的机制来处理数据一致性问题。

在本案例中的应用:
严格2PL:

执行保证: T1 和 T2 不会并发地更新 Stock ,确保最终 Stock 为 340 或 450,避免了脏


写和数据不一致。

事务隔离性高: 保证了事务的严格隔离,提升了数据的可信度。

非严格2PL:

可能执行顺序:

** T1 执行更新并释放锁后, T2 读取已更新的 Stock ,导致库存可能错误地减少。

或者, T2 在 T1 释放锁前读取并更新,可能导致数据竞态。

**最终 Stock 可能为 inconsitent values 如 340, 450,甚至错误地计算库存。

总结:

严格2PL 提供了更高的数据一致性和事务隔离性,适用于需要严格一致性的应用场景,如金融系
统,但可能降低系统并发性。

非严格2PL 提高了系统的并发性能,适用于对数据一致性要求较低或系统能容忍一定数据不一致性
的场景,但需要额外机制保障数据的安全。

综合案例分析题目
题目:

在一个电子商务平台上,有一个 Products 表和一个 Orders 表。

Products 表:

ProductID ProductName Stock

P001 Laptop 50

Orders 表:

OrderID ProductID Quantity

O1001 P001 2

两个事务 T1 和 T2 同时执行以下操作:

交易 T1:

1. 查询 ProductID = P001 的 Stock (读取到 50)。

2. 购买 30 台,将 Stock 更新为 20。

3. 插入订单记录 O1002 。

4. 提交事务。

交易 T2:

1. 查询 ProductID = P001 的 Stock (读取到 50)。

2. 购买 25 台,将 Stock 更新为 25。

3. 插入订单记录 O1003 。
4. 提交事务。

假设系统采用 快照隔离(Snapshot Isolation, SI),并使用 多版本并发控制(MVCC)。

问题:

1. 描述在快照隔离下,事务 T1 和 T2 的执行过程。最终 Products 表中 Stock 的值将是多少?

2. 快照隔离下,是否存在更新冲突?如果存在,系统如何处理?

3. 解释快照隔离如何防止幻读和不可重复读,但可能仍然存在哪些并发问题。

答案:

问题 1:快照隔离下的执行过程及最终库存

快照隔离(SI)简介:

快照隔离允许事务读取执行开始时数据库的快照数据,从而避免读操作被并发写操作干扰。写操作在提
交前进行冲突检测,确保没有并发修改。

执行过程:

1. 事务时间线:

T1 和 T2 同时开始,并获取相同的数据快照( Stock = 50 )。

2. T1 执行:

1. 读取 Stock = 50 (快照)。

2. 计划购买 30 台,将 Stock 更新为 20。

3. 准备插入订单 O1002 。

3. T2 执行:

1. 读取 Stock = 50 (相同快照)。

2. 计划购买 25 台,将 Stock 更新为 25。

3. 准备插入订单 O1003 。

4. 提交阶段:

T1 提交:
1. 检测写冲突:检查 Products 表中 ProductID = P001 的 Stock 是否被其他事务修
改。

2. 未检测到冲突( T2 尚未提交)。

3. 写入更新,将 Stock 设置为 20。

4. 插入订单 O1002 ,提交事务。

T2 提交:
1. 检测写冲突:检查 Products 表中 ProductID = P001 的 Stock 是否被其他事务修改
( T1 已修改)。

2. 发现冲突,因为 T1 已更新 Stock 。

3. T2 被回滚,无法提交。

最终结果:

Products 表中 Stock : 20
订单记录:

存在订单 O1001 和 O1002

订单 O1003 不存在,因为 T2 被回滚

问题 2:快照隔离下的更新冲突及处理

存在的更新冲突:

定义: 当两个事务尝试并发地更新相同的数据行,且至少有一个事务是写操作,导致数据不一致的
情况。

在本案例中:

T1 和 T2 都尝试更新 Products.P001.Stock 。

T1 提交后, T2 的写操作检测到了 Products.P001.Stock 已被 T1 修改,构成写冲突。

系统的处理方式:

冲突检测:

快照隔离在事务提交时会检测写冲突。

如果发现有其他事务已修改待更新的数据行,则当前事务被判定为有冲突。

事务回滚:

T2 在检测到冲突后,无法安全地提交其写操作。

系统将 T2 回滚,撤销其所有操作,确保数据一致性。

结果保障:

避免丢失更新: 通过回滚其中一个事务,防止多个事务基于相同快照进行的相互冲突的更新。

数据一致性: 确保最终数据库状态的一致性,避免数据被错误地多次修改。

问题 3:快照隔离的优势与潜在并发问题

防止的并发问题:

1. 幻读(Phantom Read):

定义: 一个事务在其执行期间,两次读取满足同一条件的记录集合,结果集数量不同,因其它
事务插入或删除了满足条件的记录。

快照隔离防止方式: 每个事务读取的是一个固定的快照,不受其他事务插入或删除数据的影
响,因此幻读不会发生。

2. 不可重复读(Non-repeatable Read):

定义: 一个事务在其执行期间,两个独立的读取操作读取同一数据行,但第二次读取的值与第
一次不同,因为其他事务修改了该数据行。

快照隔离防止方式: 事务读取时基于快照的数据版本,不会看到其他事务在其执行期间的更
新,因此不可重复读不会发生。

可能仍然存在的并发问题:

1. 写冲突(Write-Write Conflict):

描述: 当两个事务尝试并发更新同一数据行时,由于快照隔离允许并发的读并在提交时进行冲
突检测,导致其中一个事务需要回滚。
示例: 本案例中, T1 和 T2 同时更新 Stock , T2 被回滚。
2. 循环依赖与乐观回滚:

描述: 多个并发事务互相依赖,导致频繁的事务回滚,尤其在高并发写操作的场景下。

影响: 系统性能下降,用户体验受影响,因为事务需要被多次回滚和重试。

3. 无法防止读-写冲突:

描述: 虽然快照隔离防止了读脏和不可重复读,但仍然允许非序列化的执行,如不同步的写操
作可以导致最终数据不一致。

示例: 在本案中,两个并发事务都基于同一初始快照进行更新,其中一个事务最终被回滚,可
能导致业务逻辑上不一致。

总结:

快照隔离 提供了高效的并发控制,特别适用于读多写少的应用场景,通过避免幻读和不可重复读,
提升了数据的一致性。

然而,快照隔离 仍需处理写冲突,特别是在高并发写操作的环境中,可能导致事务频繁回滚,影响
系统性能。

进一步措施: 为防止潜在的写冲突和维护更高的数据一致性,可以结合其他并发控制策略,如锁机
制或序列化隔离级别,以满足特定业务需求。

结论
通过以上案例分析题,您可以深入理解不同并发控制机制(如严格两阶段锁定、乐观并发控制、多版本
并发控制等)在实际数据库操作中的应用及其优缺点。掌握这些知识有助于设计更高效、一致性更强的
数据库系统,确保在多用户并发访问的环境下,数据的正确性和系统的稳定性。

建议您在复习时,多思考这些并发控制机制如何在不同场景下运作,并结合实际业务需求选择最合适的
并发控制策略。

You might also like