根据可恢复性特征化调度(DBMS)

2025年4月6日 | 阅读 5 分钟

在本文中,我们将理解DBMS中基于可恢复性来描述调度的概念。

引言

在此,我们将讨论并发执行期间事务失败的影响。如果事务失败,我们需要撤销事务的影响,并将数据库恢复到事务启动之前的S一致状态。因此,在一个允许并发执行的系统中,有必要确保所有依赖于中止事务的事务也应该中止。重要的是要指出那些恢复相对简单的调度。这些描述实际上并不提供恢复算法,而只是理论上描述不同类型的调度。

调度是什么意思?

并发运行事务的操作执行顺序决定了调度的类型。当事务同时运行时,它们的操作可能会相互冲突。如果两个操作满足以下条件,则称它们在调度中发生冲突:

  • 操作必须属于不同的事务。
  • 操作访问相同的数据项。
  • 至少其中一个操作必须是写入操作。

在讨论不同类型的调度之前,我们应该了解完整调度的概念。

如果满足以下条件,则调度称为完整调度:

  • 调度中的操作必须与调度中包含的事务操作相对应,并且调度中的每个事务都包含一个已提交或未完成的操作作为最后一个操作。
  • 对于任何两个冲突操作,其中一个事务必须在调度中先于另一个事务发生。
  • 调度中的操作顺序必须与每个事务中出现的操作顺序相同。

通常,在事务处理系统中很难遇到完整的调度,因为新事务不断地提交到系统。调度可以根据所有事务是否成功完成或发生故障来描述。

发生一些故障的调度是基于可恢复性概念的。

调度有三种类型

  • 可恢复调度
  • 无级联调度
  • 严格调度

让我们一一详细讨论。

可恢复调度

我们必须确保一旦事务 T 提交,它就不应该再需要回滚 T。理论上,符合此规则的调度称为可恢复调度,不符合此规则的调度称为不可恢复调度,因此不应允许。

以下调度是可恢复调度

S1 调度
T1(事务)T2(事务)
读取 (A)
读取 (B)
写入 (A)
读取 (A)
写入 (A)
-
-

以下调度是不可恢复调度

S2 调度
T1(事务)T2(事务)
读取 (A)
写入 (A)
读取 (A)
提交
读取 (B)
-
-

假设在调度 S2 中,事务 T1 和 T2 并发运行,事务 T2 只对数据项 A 执行读操作,即 Read (A)。假设 调度 允许事务 T2 在提交操作后立即提交。因此,我们发现事务 T2 在 T1 之前提交。现在假设事务 T1 在提交之前失败,因此我们需要回滚到事务 T1 开始之前的先前一致状态,但 T2 已经读取了 T1 写入的数据项 A。因此,我们还必须回滚 T2 以确保原子性,但这不可能,因为事务 T2 已经提交,因此如果事务 T1 失败,则无法正确恢复。因此,这种情况是不可恢复调度的示例,不应允许。

由于大多数数据库系统要求所有调度都必须是可恢复的。因此,在可恢复调度中,每一对事务 T1 和 T2 读取的数据项是 T1 之前写入的,T1 的提交操作必须出现在 T2 的提交操作之前,如调度 S1 所示。

在调度 S1 中,事务 T1 的所有操作在 T2 读取 T1 写入的数据项之前完成并提交。

无级联调度

在可恢复调度中,已提交的事务永远不需要回滚。当大量事务在调度中并发运行时,可能会出现一种情况,即一个事务的失败导致大量依赖事务的回滚。这种一系列回滚的现象称为级联回滚。

以下调度是级联调度

S1 调度
T1(事务)T2(事务)T3(事务)
读取 (A)
写入 (A)
-读取 (A)
-读取 (B)
-写入 (B)
--
--读取 (B)

在这个调度 S1 中,事务 T1 写入数据项 A 的值,该值被事务 T2 读取,事务 T2 写入数据项 B 的值,该值被事务 T3 读取。现在假设在某个时候,事务 T1 失败。因此事务 T1 应该回滚。由于 T2 依赖于 T1,T3 依赖于 T2,所以这些依赖事务也应该回滚。

级联回滚是不可取的,因为它可能非常耗时,因为大量事务必须回滚,因此最好将调度限制为不会发生级联回滚的调度,此类调度称为无级联调度。

如果对于每一对事务 T1 和 T2,T2 读取了 T1 之前写入的数据项,则 T1 的提交操作出现在 T2 的读取操作之前,则可恢复调度称为无级联调度。

因此,在调度 S1 中,事务 T1 必须在 T2 读取事务 T1 中写入的数据项之前提交,并且事务 T2 必须在事务 T3 读取事务 T2 写入的数据项 B 之前提交。

所以我们可以得出结论,每一个非级联调度也是可恢复的严格调度。

严格调度

这是一种比可恢复和非级联调度更严格的调度,称为严格调度。在这种调度中,事务不能读取或写入数据项,直到最后写入该数据项的事务完成或中止。严格调度简化了恢复过程。

在此调度中,撤销中止事务的写入操作很容易,因为只需恢复数据项的旧值。此过程始终适用于严格调度,但不适用于可恢复或非级联调度。

以下调度不是严格调度

S1 调度
T1(事务)T2(事务)
读取 (A)
读取 (A)
A := A - 4
写入 (A)
-A := A - 1
-写入 (A)
-
中止

以下调度是严格调度

S2 调度
T1(事务)T2(事务)
读取 (A)
读取 (A)
A := A - 4
写入 (A)
中止A := A - 1
写入 (A)

调度 S1 不是严格调度,因为它允许事务 T2 写入数据项 A,尽管事务 T1 写入 A 尚未提交或中止,这违反了严格调度的定义。严格调度意味着可恢复和非级联调度,但反之则不成立。


下一主题磁盘块的缓存