# 第十一章

### 1．试述事务的概念及事务的 4 个特性。恢复技术能保证事务的哪些特性?

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

事务具有 4 个特性: 原子性 ( Atomicity ) .一致性 ( Consistency ) 、 隔离性 (Isolation ) 和持续性(Durability ) 。这 4 个特性也简称为ACID 特性。

* 原子性:事务是数据库的逻辑工作单位,事务中包括的诸操作要么都做,要么都不做。
* 一致性:事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态 。
* 隔离性 :一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
* 持续性 :持续性也称永久性(permanence) ,指一个事务一旦提交 ,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其执行结果有任何影响。

故障恢复可以保证事务的原子性与持续性。

### 2．为什么事务非正常结束时会影响数据库数据的正确性,请举例说明之。

事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。如果数据库系统运行中发生故障,有些事务尚未完成就被迫中断 这些来完成事务对数据库所和做的修改有三部分已写关物理数据库这时数据库就可能处于不正确的状态

例如某工厂的库存管理系统中,要把数量为Q的某种零件从仓库 1 移到仓库 2 存放,则可以定义一个事务 T,T包括两个操作:Q1=Q1-Q,Q2=Q2+Q。如果了非正常终止时只做了第一个操作 ,则数据库就处于不一致性状态 ,库存量无缘无故少了Q。

### 3．登记日志文件时为什么必须先写日志文件 ,后写数据库?

如果先写了数据库修改，而在运行记录中没有登记下这个修改，则以后就无法恢复这个修改了。如果先写日志，但没有修改数据库，按日志文件恢复时只不过是多执行一次不必要的UNDO操作，并不会影响数据库的正确性。所以为了安全，一定要先写日志文件，即首先把日志记录写到日志文件中，然后写数据库的修改

### 4．考虑下图所示的日志记录:

1. 如果系统故障发生在 14 之后 ,说明哪些事务需要重做,哪些事务需要回滚;&#x20;
2. 如果系统故障发生在 10 之后 ,说明哪些事务需要重做,哪些事务需要回滚;&#x20;
3. 如果系统故障发生在 9 之后,说明哪些事务需要重做,哪些事务需要回滚;
4. &#x20;如果系统故障发生在 7 之后,说明哪些事务需要重做,哪些事务需要回滚。

（1）T1、T3重做；T2、T4回滚

（2）T1重做；T2、T3回滚

（3）T1重做；T2、T3回滚

（4）T1重做；T2回滚

### 5．考虑表11.2 所示的日志记录 ,假设开始时、B、C 的值都是0:

1. 如果系统故障发生在 14 之后 ,写出系统恢复后 4.B、C 的值。&#x20;
2. 如果系统故障发生在 12 之后 ,写出系统恢复后4、.B、C 的值。
3. &#x20;如果系统故障发生在 10 之后 ,写出系统恢复后 4.B、C 的值。
4. &#x20;如果系统故障发生在 9 之后 ,写出系统恢复后 4.B、C 的值。&#x20;
5. 如果系统故障发生在 7 之后,写出系统恢复后 4.B、C 的值。
6. &#x20;如果系统故障发生在 5 之后 ,写出系统恢复后4.B、C 的值。

（1）A=8、B=7、C=11

（2）A=10、B=0、C=11

（3）A=10、B=0、C=11

（4）A=10、B=0、C=11

（5）A=0、B=0、C=0

### 6．针对不同的故障,试给出恢复的策略和方法。(即如何进行事务故障的恢复.系统故 障的恢复,以及如何进行介质故障恢复。)

**事务故障的恢复步骤是**:&#x20;

1. 反向扫描文件日志,查找该事务的更新操作。
2. 对该事务的更新操作执行逆操作。即将日志记录中“更新前的值"写人数据库。直至读到此事务的开始标记,该事务故障的恢复就完成了。

**系统故障的恢复步骤是:**&#x20;

1. 正向扫描日志文件,找出在故障发生前已经提交的事务队列(REDO队列)和未完成的事务队列(UNDO队列)。
2. 对未完成的事务队列中的各个事务进行UNDO处理。
3. 对已经提交的事务队列中的各个事务进行REDO处理

**介质故障的恢复步骤是：**

1. 装入最新的数据库后备副本(离故障发生时刻最近的转储副本),使数据库恢复到最近册次转储时的一致性状态。
2. 装入转储结束时刻的日志文件副本。
3. 启动系统恢复命令,由DBMS 完成恢复功能,即重做已完成的事务。

### 7．什么是检查点记录 ,检查点记录包括哪些内容?

检查点记录是一类新的日志纪录。它的内容包括:&#x20;

1. 建立检查点时刻所有正在执行的事务清单
2. 这些事务的最近一个日志记录的地址

### 8．具有检查点的恢复技术有什么优点? 试举一个具体的例子加以说明。

利用日志技术进行数据库恢复时,恢复子系统必须搜索整个日志,这将耗费大量的时间。 此外,需要 REDO 处理的事务实际上已经将它们的更新操作结果写到数据库中了 ,恢复子系 统又重新执行了这些操作 ,浪费了大量时间。

### 9．试述使用检查点方法进行恢复的步骤。&#x20;

1. 从重新开始文件中找到最后一个检查点记录在日志文件中的地址，由该地址在日志文件中找到最后一个检查点记录
2. 由该检查点记录得到检查点建立时刻所有正在执行的事务清单ACTIVE-LIST。建立如下两个事物队列 &#x20;

* UNDO-LIST:需要执行UNDO操作的事物集合。
* REDO-LIST:需要执行REDO操作的事物集合 。

3. 从检查点开始正向扫描日志文件

* 如果有新提交的事物T，则把T从**UNDO-LIST**&#x20;
* 如果有新提交的事物T，则把T从UNDO-LIST移到REDO-LIST
* 重复，直到扫描日志文件结束

4. 对撤销-列表中的每个事物执行撤销操作；对重做列表中每个事物执行重做操作

### 10．什么是数据库镜像?它有什么用途?

数据库镜像即根据DBA的要求,自动把整个数据库或者其中的部分关键数据复制到另一个磁盘上。每当主数据库更新时, DBMS自动把更新后的数据复制过去,即 DBMS自动保证镜像数据与主数据的一致性。

数据库镜像的用途:&#x20;

1. 用于数据库恢复。当出现介质故障时,镜像磁盘可继续使用,同时DBMS自动利用镜像磁盘数据进行数据库的恢复,不需要关闭系统和重装数据库副本。&#x20;
2. 提高数据库的可用性。在没有出现故障时,当一个用户对某个数据加排他锁进行修改时,其他用户可以读镜像数据库上的数据,而不必等待该用户释放锁。&#x20;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://hiki-nazimis-organization.gitbook.io/database6th/di-shi-yi-zhang.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
