跳转至

第九章作业

概念简答

什么是事务?它有哪些属性?

事务是 是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位

具备原子性 一致性 隔离性 持久性

并发操作困难会产生哪几类数据不一致?

  • 丢失修改
  • 不可重复读
  • 读"脏数据"
  • 幻像

什么是封锁?基本的封锁类型有几种?简述它们的含义。

封锁是事务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; img

① 如果系统故障发⽣在 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

考虑下图所⽰的⽇志记录:

img

① 如果系统故障发⽣在 14 之后,说明哪些事务需要重做,哪些事务需要回滚。

② 如果系统故障发⽣在 10 之后,说明哪些事务需要重做,哪些事务需要回滚。

③ 如果系统故障发⽣在 9 之后,说明哪些事务需要重做,哪些事务需要回滚。

④ 如果系统故障发⽣在 7 之后,说明哪些事务需要重做,哪些事务需要回滚。

第一问 T1 T3 重做 T4回滚即可

第二问 T1重做 T3 T4回滚

第三问 T1重做 T2 T3 T4回滚

第四问 同第三问

Q3

设T1,T2,T3是如下的3各事务。

\[\begin{cases}T_1: A=A+2\\T_2: A=2A\\T_3: A=A^2\end{cases}\]

设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完成写 在串行中也会被及时覆盖 所以不会产生冲突