调度,顾名思义,是一个将事务排列起来并一一执行的过程。当有多个事务并发运行,并且需要设置操作顺序,使操作不相互重叠时,调度就发挥作用,对事务进行相应的计时。事务和调度的基础在并发控制(介绍)和 DBMS 文章中的事务隔离级别中讨论。在这里,我们将讨论各种类型的时间表。
- 串行时间表:
事务以非交错方式执行的调度,即串行调度是在运行事务结束之前没有事务开始的调度,称为串行调度。示例:考虑以下涉及两个事务 T 1和 T 2 的调度。
T1 T2 R(A) W(A) R(B) W(B) R(A) R(B) 其中 R(A) 表示对某个数据项“A”执行读取操作
这是一个串行调度,因为事务以 T 1 —> T 2 的顺序串行执行 - 非系列时间表:
这是一种调度类型,其中多个事务的操作是交错的。这可能会导致并发问题的增加。事务以非串行方式执行,保持最终结果正确且与串行调度相同。与一个事务必须等待另一个事务完成其所有操作的串行调度不同,在非串行调度中,另一个事务在不等待前一个事务完成的情况下继续进行。这种调度不提供并发事务的任何好处。它可以有两种类型,即可序列化和不可序列化的调度。非串行调度可以进一步分为可串行化和不可串行化。
- 可序列化:
这用于维护数据库的一致性。主要用于Non-Serial调度,验证调度是否会导致不一致。另一方面,串行调度不需要可串行化,因为它只有在前一个事务完成时才会跟随一个事务。对于 n 个事务,只有当非串行调度与串行调度等效时,才称非串行调度处于可串行化调度中。由于在这种情况下允许并发,因此可以同时执行多个事务。可序列化的调度有助于提高资源利用率和 CPU 吞吐量。它们有两种类型:- 冲突可序列化:
如果可以通过交换非冲突操作将调度转换为串行调度,则该调度称为冲突可序列化。如果所有条件都满足,则称两个操作是冲突的:- 它们属于不同的交易
- 它们对相同的数据项进行操作
- 其中至少一个是写操作
- 查看可序列化:
如果视图等于串行调度(没有重叠事务),则调度称为视图可序列化。冲突调度是可序列化的视图,但如果可序列化包含盲写,则可序列化视图不会与可序列化冲突。
- 冲突可序列化:
- 不可序列化:
不可序列化的调度分为两种类型,可恢复调度和不可恢复调度。- 可恢复时间表:
事务仅在它们读取其更改的所有事务提交之后才提交的调度称为可恢复调度。换句话说,如果一些事务T j被读取值来更新或通过一些其它的事务T I写入,则提交T J的后提交T I的必须发生。示例 –考虑以下涉及两个事务 T 1和 T 2 的调度。
T1 T2 R(A) W(A) W(A) R(A) commit commit 这是一个可恢复的调度,因为 T 1在 T 2之前提交,这使得 T 2读取的值正确。
可以有三种类型的可恢复计划:
- 级联时间表:
也称为避免级联中止/回滚 (ACA)。当一个事务发生故障导致回滚或中止其他相关事务时,这种调度称为级联回滚或级联中止。例子:
- 无级联时间表:
事务仅在它们要读取其更改的所有事务提交后才读取值的调度称为无级联调度。避免单个事务中止导致一系列事务回滚。防止级联中止的策略是禁止事务从同一调度中的另一个事务读取未提交的更改。换句话说,如果某个事务 T j想要读取某个其他事务 T i更新或写入的值,那么 T j的提交必须在 T i提交之后读取它。
示例:考虑以下涉及两个事务 T 1和 T 2 的调度。
T1 T2 R(A) W(A) W(A) commit R(A) commit 此计划是无级联的。由于更新的A值仅在更新事务(即 T 1提交)之后才被 T 2 读取。
示例:考虑以下涉及两个事务 T 1和 T 2 的调度。
T1 T2 R(A) W(A) R(A) W(A) abort abort 这是一个可恢复的计划,但它不能避免级联中止。可以看出,如果T 1中止,T 2也将不得不中止以保持调度的正确性,因为T 2已经读取了T 1写入的未提交值。
- 严格的时间表:
如果对于任意两个事务 T i , T j ,如果 T i的写操作先于 T j的冲突操作(读或写),那么 T i的提交或中止事件也先于该冲突操作,则调度是严格的T j 。
换句话说,只有在 T i提交/中止之后,T j才能读取或写入 T i 的更新或写入值。示例:考虑以下涉及两个事务 T 1和 T 2 的调度。
T1 T2 R(A) R(A) W(A) commit W(A) R(A) commit 这是一个严格的时间表,因为 T 2只在 T 1提交之后才读取和写入由 T 1写入的 A 。
- 级联时间表:
- 不可恢复的时间表:
示例:考虑以下涉及两个事务 T 1和 T 2 的调度。
T1 T2 R(A) W(A) W(A) R(A) commit abort T 2读取T 1写入的A 的值,并提交。 T 1后来中止,因此 T 2读取的值是错误的,但由于 T 2 已提交,此计划是不可恢复的。
- 可恢复时间表:
- 可序列化:
注——可以看出:
- 无级联调度比可恢复调度更严格,或者是可恢复调度的子集。
- 严格调度比无级联调度更严格,或者是无级联调度的子集。
- 串行调度满足所有可恢复、无级联和严格调度的约束,因此是严格调度的一个子集。
各种类型的调度之间的关系可以描述为:
示例:考虑以下时间表:
S:R1(A), W2(A), Commit2, W1(A), W3(A), Commit3, Commit1
以下内容哪些是对的?
(A) 调度是视图可序列化调度和严格可恢复调度
(B) 调度是不可序列化调度和严格可恢复调度
(C) 调度是不可串行化调度,不是严格的可恢复调度。
(D) Schedule是可序列化的调度,不是严格的可恢复调度
解决方案:时间表可以重写为:-
T1 | T2 | T3 |
---|---|---|
R(A) | ||
W(A) | ||
Commit | ||
W(A) | ||
W(A) | ||
Commit | ||
Commit |
首先,它是一个视图可串行化调度,因为它具有视图相等的串行调度 T 1 —> T 2 —> T 3满足视图可串行化所需的变量 A 的初始和更新读取以及最终写入。现在我们可以看到有写-写对由事务 T 1和 T 3 完成,这违反了上述严格调度的条件,因为 T 3应该只在 T 1提交后才进行写操作,这违反了给定的日程。因此,给定的时间表是可序列化的,但不是严格可恢复的。
所以,选项(D)是正确的。