原文筆記
本課程筆記資料庫系統 · 30 篇
Day 07 - 数据库70题:试题 12-25
参考重点:教材第 4 章安全性、第 5 章完整性、第 11 章恢复技术、第 12 章并发控制。
12. 数据库保护的四个方面各防止什么错误的发生?
答案:
数据库保护包括安全性、完整性、并发控制和恢复四方面。
- 安全性:防止非法用户或越权用户访问、泄露、篡改、破坏数据。
- 完整性:防止不符合语义的数据进入数据库,例如主键重复、外键悬空、成绩超过范围。
- 并发控制:防止多个事务交叉执行造成丢失修改、读脏数据、不可重复读、不一致分析。
- 恢复:防止事务故障、系统故障、介质故障后数据库停留在错误或不一致状态。
讲解:可以把这四类保护记成“谁能动数据、数据是否合法、多事务怎么动、出故障怎么补救”。
13. 试解释 COMMIT 语句和 ROLLBACK 语句。
答案:
COMMIT:提交事务,使事务对数据库所做的更新永久生效。ROLLBACK:回滚事务,撤销当前事务尚未提交的全部更新,使数据库回到事务开始前的一致状态。
SQL Server 示例:
BEGIN TRANSACTION;
UPDATE dbo.Accounts
SET Balance = Balance - 300
WHERE AccountNo = 'A001';
COMMIT TRANSACTION;
-- 如果出现错误,则执行 ROLLBACK TRANSACTION;
讲解:COMMIT 对应持久性,ROLLBACK 对应原子性。事务失败时,已做的局部更新不能留下。
14. 试解释 UNDO 操作和 REDO 操作。
答案:
UNDO:撤销未提交或失败事务已经执行的更新,常利用日志中的旧值把数据改回去。REDO:重做已提交事务的更新,常利用日志中的新值把提交结果重新写入数据库。
讲解:系统崩溃时,内存中已提交事务的结果可能尚未写到磁盘,所以要 REDO;未提交事务的部分结果可能已经写到磁盘,所以要 UNDO。
15. DBS 运行中一般有哪几类故障?
答案:
常见故障包括:
- 事务故障:某个事务因逻辑错误、死锁回滚等提前终止。
- 系统故障:断电、操作系统崩溃等导致系统停止运行,但外存数据库未损坏。
- 介质故障:磁盘等外存介质损坏,导致数据库文件部分或全部丢失。
- 计算机病毒、恶意破坏或其他灾难性故障。
讲解:事务故障和系统故障通常可由 DBMS 自动恢复;介质故障需要后援副本和日志,往往需要 DBA 参与。
16. 试叙述 DB 的并发控制与恢复的关系。
答案:
并发控制和恢复都是为了维护数据库一致性。并发控制在正常运行时保证多个事务隔离执行,恢复在故障后保证已提交事务不丢失、未提交事务不残留。
讲解:
- 并发控制解决“同时执行会不会互相干扰”。
- 恢复解决“执行中出故障后怎样回到一致状态”。
- 严格两段锁等协议能避免级联回滚,使恢复更简单。
- 日志记录必须反映事务更新顺序,才能正确 UNDO 和 REDO。
17. 试叙述基本封锁类型的含义。
答案:
基本封锁类型有共享锁和排他锁。
- 共享锁(S 锁):事务对数据对象加 S 锁后,可以读该对象,其他事务也可以再加 S 锁读,但不能加 X 锁写。
- 排他锁(X 锁):事务对数据对象加 X 锁后,可以读写该对象,其他事务不能再加 S 锁或 X 锁。
讲解:相容性表要记住:S-S 相容,S-X 不相容,X-X 不相容。
18. 有些事务只要读数据,为什么要加 S 锁?
答案:
只读事务加 S 锁是为了防止读到正在被其他事务修改但尚未提交的数据,也防止读的过程中数据被改掉,从而保证隔离性。
讲解:如果读操作不加锁,可能发生读脏数据或不可重复读。S 锁允许多个读事务并发,但会阻止写事务同时修改同一对象。
19. 试叙述两段锁协议。
答案:
两段锁协议规定每个事务的封锁过程分成两个阶段:
- 扩展阶段:事务可以申请并获得新的锁,但不能释放任何锁。
- 收缩阶段:事务可以释放锁,但不能再申请新的锁。
讲解:所有事务遵循两段锁协议时,所产生的并发调度是冲突可串行化的。两段锁协议不能保证不死锁;严格两段锁要求写锁通常保持到事务结束,可避免级联回滚。
20. 列举基于日志的恢复方法的实现要点。
答案:
实现要点包括:
- 对每次更新登记日志,记录事务号、数据对象、旧值、新值等。
- 遵守先写日志原则(WAL):更新数据页写入磁盘前,对应日志必须先写入稳定存储。
- 事务提交时必须先写入提交日志记录。
- 周期性建立检查点,减少恢复时扫描日志的范围。
- 恢复时对已提交但可能未落盘的事务执行
REDO,对未提交事务执行UNDO。
讲解:日志是恢复的“时间线”。没有日志,就无法知道哪些修改要重做、哪些修改要撤销。
21. 列举三种解决死锁的常用方法。
答案:
- 死锁预防:规定资源申请顺序,或采用时间戳策略,如 wait-die、wound-wait。
- 死锁检测与解除:构造等待图,发现环后回滚某个事务释放资源。
- 超时法:事务等待超过阈值就认为可能死锁,主动回滚。
讲解:预防法开销可能较大但避免死锁;检测法允许死锁发生再处理;超时法简单但可能误判。
22. 什么叫转储?转储有什么作用?
答案:
转储是定期将数据库复制到后援存储介质上,形成数据库后援副本的过程。作用是在介质故障或严重破坏后,用后援副本和日志恢复数据库。
讲解:转储分静态转储和动态转储。静态转储期间不允许更新,简单但影响服务;动态转储允许并发事务执行,但必须配合日志。
23. 简述 DBMS 实现完整性的方法。
答案:
DBMS 实现完整性通常包括三步:
- 定义完整性约束:主键、外键、
UNIQUE、NOT NULL、CHECK、触发器等。 - 检查完整性约束:在插入、删除、修改时自动检查。
- 违约处理:拒绝操作,或按规则级联更新、级联删除、置空、置默认值。
SQL Server 示例:
CREATE TABLE dbo.Score (
Sno varchar(20) NOT NULL,
Cno varchar(20) NOT NULL,
Grade decimal(5, 2) NULL,
CONSTRAINT PK_Score PRIMARY KEY (Sno, Cno),
CONSTRAINT CK_Score_Grade CHECK (Grade BETWEEN 0 AND 100)
);
讲解:完整性是“数据是否合理”的问题,不能只靠应用程序检查,应该尽量交给 DBMS 统一约束。
24. 试叙述完整性分类。
答案:
常见分类有:
- 按关系模型基本规则:实体完整性、参照完整性、用户定义完整性。
- 按约束对象:属性级约束、元组级约束、关系级约束。
- 按状态变化:静态约束和动态约束。
讲解:考试最常考的是前三类。实体完整性约束主键,参照完整性约束外键,用户定义完整性表达具体业务规则。
25. 数据库安全性与完整性有什么区别?
答案:
安全性关注防止未授权访问和非法使用;完整性关注数据是否正确、有效、相容。
讲解:
- 安全性问的是:“这个用户有没有资格看或改?”
- 完整性问的是:“这个数据值本身合不合法?”
- 例子:无权限用户查看成绩表是安全性问题;成绩写成 150 是完整性问题。