第九章作业¶
概念简答¶
什么是事务?它有哪些属性?
事务是 是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位
具备原子性 一致性 隔离性 持久性
并发操作困难会产生哪几类数据不一致?
- 丢失修改
- 不可重复读
- 读"脏数据"
- 幻像
什么是封锁?基本的封锁类型有几种?简述它们的含义。
封锁是事务T在对某个数据对象例如表、记录等操作之前,先向系统发出请求,对其加锁。加锁后事务T就对该数据对象有了一定的控制,在事务T释放它的锁之前,其他事务对该数据的操作受到一定限制 类似OS的锁
包含
- 排它锁 即在写数据的时候拒绝其他事务同时写产生冲突
- 共享锁 事务在读数据时运行其他事务一并读
如何用封锁机制保证数据的一致性?
制定三级封锁协议
- 一级封锁协议:修改数据前必须加X锁,直到事务结束才释放。可避免丢失修改
- 二级封锁协议:在一级的基础上,读取数据前必须加S锁,读完后即可释放S锁。可避免丢失修改和读“脏”数据
- 三级封锁协议:在一级的基础上,读取数据前必须加S锁,直到事务结束才释放。可避免丢失修改、读“脏”数据和不可重复读
如何保证并行操作的可串行性?
即两段锁协议
- 在对任何数据进行读、写操作之前,首先要申请并获得对该数据的封锁
- 在释放一个封锁之后,事务不再申请和获得任何其他封锁
先全部加锁 再逐个放锁
简述死锁和活锁的产生原因和解决方法
活锁:
- 原因:事务T1封锁了数据,T2等待;后续T3、T4等不断申请该数据,系统不断优先批准后来的请求,导致T2有可能永远处于等待状态
- 解决:采用“先来先服务”的策略
死锁:
- 原因:遵守两段锁协议的事务互为等待。例如T1封锁了R1,T2封锁了R2;随后T1请求R2并等待,T2请求R1也等待,形成相互等待永远无法结束的僵局 。
- 解决:分为预防、诊断与解除 。诊断可通过“超时法”或检测图中是否存在回路的“等待图法” ;解除的方法是选择一个处理死锁代价最小的事务进行撤消
什么是数据库的恢复?
把数据库从错误状态恢复到某一个已知的正确状态(亦称为一致状态或完整状态)的功能
数据库转储的意义是什么?比较各种数据转储方法
建立冗余数据库来恢复
即DBA定期地将整个数据库复制到磁带或另一个磁盘上保存起来的过程。这些备用的数据文本称为后备副本或后援副本
什么是日志文件?为什么设立日志文件?登记日志文件时为什么必须先写日志文件,后写数据库?
日志是用来记录事务对数据库的更新操作的文件
设立它是为了在故障恢复时能够对已完成事务进行重做,对未完成事务进行撤销
防止部分已提交数据存于缓冲区未写入数据库 导致基于日志的重做产生偏差
数据允许过程中常见的故障有哪几类?各类故障如何恢复?
- 系统故障
- 正向扫描日志文件,建立UNDO和REDO队列
- 反向扫描日志文件,对每个UNDO事务的更新执行逆操作
- 正向扫描日志文件,对每个REDO事务的更新重新执行
- 介质故障
- DBA周期性地转储数据库
什么是数据库复制?它有什么用途?常用的复制手段有哪些?
数据库镜像是 DBMS 自动把整个数据库或其中的关键数据复制到另一个磁盘上,并自动保证镜像数据与主数据的一致性
- DBMS自动把整个数据库或其中的关键数据复制到另一个磁盘上
- DBMS自动保证镜像数据与主数据的一致性
什么是数据库镜像?它有什么用途?
数据库镜像是 DBMS 自动把整个数据库或其中的关键数据复制到另一个磁盘上,并自动保证镜像数据与主数据的一致性
- 出现介质故障时
- DBMS自动利用镜像磁盘数据进行数据库的恢复,不需要关闭系统和重装数据库副本
- 没有出现故障时
- 可用于并发操作
- 一个用户对数据加排他锁修改数据
- 其他用户可以读镜像数据库上的数据
- 可用于并发操作
综合题¶
Q1¶
考虑下图所示的日志记录,假设开始时 A、B、C 的值都是 0; 
① 如果系统故障发⽣在 14 之后,写出系统恢复后 A、B、C 的值。
② 如果系统故障发⽣在 12 之后,写出系统恢复后 A、B、C 的值。
③ 如果系统故障发⽣在 10 之后,写出系统恢复后 A、B、C 的值。
④ 如果系统故障发⽣在 9 之后,写出系统恢复后 A、B、C 的值。
⑤ 如果系统故障发⽣在 7 之后,写出系统恢复后 A、B、C 的值。
⑥ 如果系统故障发⽣在 5 之后,写出系统恢复后 A、B、C 的值。
第一问
回滚到13 此时 A被T1写为10 再被T3写为8 提交
B被T2写为9 回滚到0 再被T3写为7 C被写为11
A = 8 B = 7 C = 11
第二问
之前只有T1完成了提交 此时 A = 10 C = 11 B = 0
第三问到第五问 都是恢复到T1提交后的状态 答案一样 A = 10 B = 0 C = 11
第六问 无人提交 A = 0 B = 0 C = 0
Q2¶
考虑下图所⽰的⽇志记录:

① 如果系统故障发⽣在 14 之后,说明哪些事务需要重做,哪些事务需要回滚。
② 如果系统故障发⽣在 10 之后,说明哪些事务需要重做,哪些事务需要回滚。
③ 如果系统故障发⽣在 9 之后,说明哪些事务需要重做,哪些事务需要回滚。
④ 如果系统故障发⽣在 7 之后,说明哪些事务需要重做,哪些事务需要回滚。
第一问 T1 T3 重做 T4回滚即可
第二问 T1重做 T3 T4回滚
第三问 T1重做 T2 T3 T4回滚
第四问 同第三问
Q3¶
设T1,T2,T3是如下的3各事务。
设A的初值为0.
(1)若这3个事务允许并行执行,则有多少可能的正确结果?请一一列举。
(2)给出一个可串行化的调度,并给出执行结果。
(3)给出一个非串行化的调度,并给出执行结果。
(4)若这3个事务都遵守两段锁协议,给出一个不产生死锁的可串行化调度。
(5)若这3个事务都遵守两段锁协议,给出一个产生死锁的调度。
第一问
231 321 可以得到 A = 0
132 A = 8
312 A = 4
123 A = 16
213 A =4
第二问 $$ R_1(A) \;W_1(A)\;R_2(A) \;W_2(A)\;R_3(A) \;W_3(A)\A=16 $$ 第三问 $$ R_1(A), R_2(A), W_1(A), W_2(A), R_3(A), W_3(A)\A = 0 $$ 第四问
-
\(T_1\):获取X锁(A) \(\rightarrow\) \(R_1(A)\) \(\rightarrow\) \(W_1(A)\) \(\rightarrow\) 释放X锁(A)
-
\(T_2\):获取X锁(A) \(\rightarrow\) \(R_2(A)\) \(\rightarrow\) \(W_2(A)\) \(\rightarrow\) 释放X锁(A)
-
\(T_3\):获取X锁(A) \(\rightarrow\) \(R_3(A)\) \(\rightarrow\) \(W_3(A)\) \(\rightarrow\) 释放X锁(A)
第五问
T1申请读 \(S_1(A)\)
T1申请读 \(S_2(A)\)
T1申请写 \(X_1(A)\) 等待\(S_2\)
T2申请写 \(X_2(A)\) 等待 \(S_1\)
Q4¶
今有三个事务的⼀个调度 r3(B) r1(A) w3(B) r2(B) r2(A) w2(B) r1(B) w1(A),该调度是冲突可串⾏化的调度吗︖为什么︖
不会
梳理一下逻辑
先T3读B T1读A
再T3写B 完成流程
再T2读B T2读A
此时T2写B 完成流程
再T1读B T1写A
A的脏数据没被T2完成写 在串行中也会被及时覆盖 所以不会产生冲突