原文筆記

本課程筆記資料庫系統 · 30 篇
数据库补充习题 70+100 复习索引cs/db/100+70/00-复习索引Day 01 - 数据库100题:单项选择 1-20cs/db/100+70/Day01-数据库100题-选择01-20Day 02 - 数据库100题:单项选择 21-40cs/db/100+70/Day02-数据库100题-选择21-40Day 03 - 数据库100题:单选 41-50,填空 51-60cs/db/100+70/Day03-数据库100题-选择41-50填空51-60Day 04 - 数据库100题:填空 61-80cs/db/100+70/Day04-数据库100题-填空61-80Day 05 - 数据库100题:填空 81-100cs/db/100+70/Day05-数据库100题-填空81-100Day 06 - 数据库70题:试题 1-11cs/db/100+70/Day06-数据库70题-试题01-11Day 07 - 数据库70题:试题 12-25cs/db/100+70/Day07-数据库70题-试题12-25Day 08 - 数据库70题:综合题 1-8cs/db/100+70/Day08-数据库70题-综合01-08Day 09 - 数据库70题:综合题 22-33cs/db/100+70/Day09-数据库70题-综合22-33Day 10 - 数据库70题:综合题 37-47cs/db/100+70/Day10-数据库70题-综合37-47Day 11 - 数据库70题:综合题 48-61cs/db/100+70/Day11-数据库70题-综合48-61Day 12 - 数据库70题:综合题 62-71cs/db/100+70/Day12-数据库70题-综合62-71基础概念与题型全文cs/db/notes/01-基础概念与题型全文SQL语句与数据库操作全文cs/db/notes/02-SQL语句与数据库操作全文数据库编程全文cs/db/notes/03-数据库编程全文数据库设计与规范化全文cs/db/notes/04-数据库设计与规范化全文查询优化、恢复、并发控制全文cs/db/notes/05-查询优化恢复并发控制全文数据库规范化流程cs/db/notes/normalization2025-2026-2 计科数据库系统期末cs/db/pastpapers/25-26cs2024-2025-2 计科数据库系统期末cs/db/pastpapers/db-pastpaper-1数据库系统完整讲义总览与考试题型地图cs/db/tutorial/00-总览与考试题型地图01 数据库基础与关系模型cs/db/tutorial/01-数据库基础与关系模型02 SQL 与关系代数cs/db/tutorial/02-SQL与关系代数03 数据库编程专项:存储过程、触发器、游标、嵌入式 SQLcs/db/tutorial/03-数据库编程专项04 数据库设计、E-R 图与规范化cs/db/tutorial/04-数据库设计ER与规范化05 查询优化专项:关系代数、查询树、优化树cs/db/tutorial/05-查询优化专项06 事务、并发控制与数据库恢复cs/db/tutorial/06-事务并发控制与恢复07 填空选择速记清单cs/db/tutorial/07-填空选择速记清单08 大题答题模板cs/db/tutorial/08-大题答题模板

Day 12 - 数据库70题:综合题 62-71

参考重点:教材第 5 章完整性,第 11 章恢复技术,第 12 章并发控制。SQL 均按 SQL Server 写法。

62. 什么是数据库的转储?转储的意义是什么?

答案:

数据库转储是把数据库复制到后援存储介质上,形成后援副本的过程。意义是在数据库遭到破坏,尤其是发生介质故障时,可用后援副本和日志文件恢复数据库。

讲解:转储是恢复的基础。静态转储简单但影响业务;动态转储允许业务运行,但必须配合日志保证一致性。

63. 为什么要建立日志文件?

答案:

日志文件记录事务对数据库的更新操作,是事务故障和系统故障恢复的依据。通过日志可以撤销未提交事务、重做已提交事务,并配合检查点提高恢复效率。

讲解:日志通常记录事务标识、操作类型、数据对象、旧值、新值等。必须遵守先写日志原则:数据页写盘前,相应日志先写入稳定存储。

64. 怎样进行系统故障的恢复?

答案:

系统故障恢复一般步骤:

  1. 从最近检查点开始扫描日志。
  2. 找出故障时已经提交但可能未完全写盘的事务,执行 REDO。
  3. 找出故障时尚未提交的事务,执行 UNDO。
  4. 恢复结束后数据库回到一致状态。

讲解:系统故障不破坏外存数据库文件,但会丢失内存缓冲区内容。因此既可能需要重做提交事务,也可能需要撤销未提交事务。

65. 怎样进行介质故障的恢复?

答案:

介质故障恢复一般步骤:

  1. 更换或修复故障介质。
  2. 装入最近一次数据库后援副本。
  3. 利用转储以来的日志文件,重做已经提交的事务。
  4. 必要时撤销未提交事务,使数据库达到一致状态。

讲解:介质故障会损坏外存数据,因此仅靠日志不够,必须先有数据库备份作为恢复起点。

66. 数据库在运行过程可能产生的故障有哪几类?

答案:

常见故障包括:

  1. 事务故障。
  2. 系统故障。
  3. 介质故障。
  4. 计算机病毒、恶意破坏或灾难性故障。

讲解:不同故障需要不同恢复策略。事务故障通常 UNDO 即可;系统故障需要 UNDO/REDO;介质故障需要备份和日志。

67. 叙述数据库的并发控制。

答案:

数据库并发控制是 DBMS 对多个事务同时访问同一数据的操作进行调度和协调,使并发执行结果等价于某个串行执行结果,从而保持数据库一致性。

常用方法:

  • 封锁机制和两段锁协议。
  • 时间戳排序。
  • 多版本并发控制(MVCC)。
  • 设置事务隔离级别。

讲解:并发控制的目标不是消灭并发,而是在高并发和正确性之间平衡。教材重点是封锁、封锁协议、可串行化和死锁处理。

68. 在数据库保护中,安全性和完整性有何区别?

答案:

  • 安全性:保护数据库免受非法访问、非法使用、泄露或破坏。
  • 完整性:保证数据库中的数据正确、有效、相容,符合语义约束。

例子:

  • 用户没有权限查看成绩表却试图查询,这是安全性问题。
  • 成绩被写成 150 分,这是完整性问题。

讲解:安全性管“谁能做”,完整性管“做出来的数据是否合法”。

69. 设数据库含 S、C、D 三个关系表,使用 SQL Server 设置各个表操作之间的完整性约束。

题面关系:

S

学号姓名班号
S2王华98001
S6李英98002
S12刘强98003

C

课程号课程名称
K1英语
K12高等数学

D

学号课程号分数
S2K184
S6K179
S12K195
S2K1291
S6K1282
S12K1267

答案:

CREATE TABLE dbo.S (
    学号 varchar(20) NOT NULL,
    姓名 nvarchar(50) NOT NULL,
    班号 varchar(20) NOT NULL,
    CONSTRAINT PK_S PRIMARY KEY (学号)
);

CREATE TABLE dbo.C (
    课程号 varchar(20) NOT NULL,
    课程名称 nvarchar(100) NOT NULL,
    CONSTRAINT PK_C PRIMARY KEY (课程号),
    CONSTRAINT UQ_C_课程名称 UNIQUE (课程名称)
);

CREATE TABLE dbo.D (
    学号 varchar(20) NOT NULL,
    课程号 varchar(20) NOT NULL,
    分数 decimal(5, 2) NULL,
    CONSTRAINT PK_D PRIMARY KEY (学号, 课程号),
    CONSTRAINT FK_D_S FOREIGN KEY (学号)
        REFERENCES dbo.S(学号)
        ON UPDATE CASCADE
        ON DELETE NO ACTION,
    CONSTRAINT FK_D_C FOREIGN KEY (课程号)
        REFERENCES dbo.C(课程号)
        ON UPDATE CASCADE
        ON DELETE NO ACTION,
    CONSTRAINT CK_D_分数 CHECK (分数 BETWEEN 0 AND 100)
);

讲解:

  • S.学号 和 C.课程号 是实体完整性。
  • D(学号, 课程号) 是选课表组合主键,保证同一学生同一课程只有一条成绩。
  • D.学号、D.课程号 是外键,保证参照完整性。
  • CHECK 保证用户定义完整性。
  • ON DELETE NO ACTION 表示有选课记录时不能随便删除学生或课程;如果业务要求删除学生时同步删除成绩,可改成 ON DELETE CASCADE。

70. 设有三个事务 T1、T2 和 T3,动作分别为:T1: A=A+2,T2: A=A*2,T3: A=A**2。假定这三个事务允许并行操作,讨论它们可能实施的调度。

答案:

若要求正确并发,调度结果应等价于某个串行调度。设初值为 A=a,三个事务的 6 种串行顺序结果为:

串行顺序最终结果
T1 -> T2 -> T3((a + 2) * 2)^2
T1 -> T3 -> T2(a + 2)^2 * 2
T2 -> T1 -> T3(2a + 2)^2
T2 -> T3 -> T1(2a)^2 + 2
T3 -> T1 -> T2(a^2 + 2) * 2
T3 -> T2 -> T12a^2 + 2

讲解:这三个操作都读写同一数据 A,彼此不交换顺序。例如先加 2 再乘 2,与先乘 2 再加 2 结果不同。因此正确调度必须可串行化。实际系统中可让每个事务对 A 加 X 锁并保持到提交,这样并发执行会退化为某个串行顺序,但结果正确。

71. 假设存款余额 X=1000 元,甲事务取走 300 元,乙事务取走 200 元,执行时间如下。如何实现这两个事务的并发控制?

题面调度:

甲事务时间乙事务
读 XT1
T2读 X
更新 X=X-300T3
T4更新 X=X-200

答案:

该调度会产生丢失修改。甲、乙都读到 X=1000,甲写回 700,乙再按旧值写回 800,最终余额可能为 800,甲的取款被覆盖;正确结果应为 500。

可用排他锁或可串行化事务控制:

-- 甲事务
BEGIN TRANSACTION;

UPDATE dbo.Accounts
SET Balance = Balance - 300
WHERE AccountNo = 'X';

COMMIT TRANSACTION;

-- 乙事务
BEGIN TRANSACTION;

UPDATE dbo.Accounts
SET Balance = Balance - 200
WHERE AccountNo = 'X';

COMMIT TRANSACTION;

若必须先读再算,可在 SQL Server 中使用更新锁和保持锁:

BEGIN TRANSACTION;

DECLARE @x decimal(12, 2);

SELECT @x = Balance
FROM dbo.Accounts WITH (UPDLOCK, HOLDLOCK)
WHERE AccountNo = 'X';

UPDATE dbo.Accounts
SET Balance = @x - 300
WHERE AccountNo = 'X';

COMMIT TRANSACTION;

讲解:UPDLOCK, HOLDLOCK 使事务在读取余额时就锁住该行,并保持到事务结束,另一个事务必须等待。这样两个取款事务按某个串行顺序执行,最终余额为 1000 - 300 - 200 = 500。