DBMS 中不同类型的调度是什么?
调度被定义为事务的执行序列。调度维护每个单独事务中操作的顺序。调度是事务操作的安排。调度可能包含一组事务。我们已经知道事务是一组操作。为了并发运行事务,我们以交错的方式安排或调度它们的操作。
调度分为 2 类,如下所示:
- 串行调度
- 非串行调度
以下是用图表形式给出的调度类别:
串行调度
此调度中存在的事务按顺序执行,在 Ti 的指令完成之后,Tj 的指令将被执行,其中 j=i+1。
串行调度保证一致性:
对于 2 个事务,可能的串行调度的总数 = 2。
对于 3 个事务,可能的串行调度的总数 = 6。
2 Transaction 3 Transaction T1->T2 T1->T2->T3 T2->T1 T1->T3->T2 T2->T1->T3 T2->T3->T1 T3->T1->T2 T3->T2->T1
如果 n = 事务数,则可能的串行调度的数量 = n!。
串行调度始终给出正确的结果。但是,为了提高时间效率,我们遵循并发调度。因此,我们必须确保并发调度的可串行化。
非串行调度
当事务在事务 T1 和 T2 之间重叠时。
示例
T1 | T2 |
---|---|
READ1(A) | |
WRITE1(A) | |
READ2(B) | |
WRITE2(B) | |
READ1(B) | |
WRITE1(B) | |
READ1(B) |
非串行调度的类型
非串行调度分为可串行化和非串行调度。让我们首先讨论可串行化。
可串行化有两种类型,如下所示:
视图可串行化
如果调度与串行调度视图等效,则该调度为视图可串行化。
它遵循的规则如下:
T1 读取 A 的初始值,然后 T2 也读取 A 的初始值。
T1 读取 T2 写入的值,然后 T2 也读取 T1 写入的值。
T1 正在写入最终值,然后 T2 也具有写入操作作为最终值。
冲突可串行化
它以与某些串行执行相同的方式对任何冲突操作进行排序。如果两个操作作用于相同的数据项并且其中一个是写入操作,则称这两个操作冲突。
这意味着,
Readi(x) readj(x) - 非冲突读-读操作
Readi(x) writej(x) - 冲突读-写操作。
Writei(x) readj(x) - 冲突写-读操作。
Writei(x) writej(x) - 冲突写-写操作。
非串行调度分为可恢复和不可恢复调度。让我们首先了解可恢复调度。
可恢复调度
考虑以下示例:
T1 | T2 |
---|---|
R(X) | |
W(X) | |
W(X) | |
R(X) | |
READ1(B) | |
提交 | |
提交 |
这里,事务 T2 读取事务 T1 写入的值,并且 T2 的提交发生在 T1 的提交之后。因此,这是一个可恢复调度。
同样,**可恢复调度又分为级联避免和严格调度**:
- 级联避免调度
以下是级联避免调度的示例:
T1 | T2 |
---|---|
R(X) | |
W(X) | |
W(X) | |
提交 | |
R(X) | |
提交 |
这里,事务 T2 仅在事务 T1 提交后读取 **X** 的更新值。因此,该调度为 **级联避免调度**。
- 严格调度
以下是严格调度的示例:
T1 | T2 |
---|---|
R(X) | |
R(X) | |
W(X) | |
提交 | |
W(X) | |
R(X) | |
提交 |
这里,事务 T2 仅在事务 T1 提交后读取和写入事务 T1 的更新或写入值。因此,该调度为 **严格调度**。
现在让我们看看不可恢复调度。
不可恢复调度
不可恢复的调度就是不可恢复的。如果 Ti 的提交操作没有发生在 Tj 的提交操作之前,则它是不可恢复的。
考虑以下给出的不可恢复调度的示例:
调度 1
T1 | T2 |
---|---|
read(x) | |
x=x-n | |
write(x) | |
read(x) | |
x=x+n | |
write(x) | |
提交 |
调度 2
T1 | T2 |
---|---|
read(a) | |
a=a+5 | |
write(a) | |
read(a) | |
提交 |