DBMS 调度和调度类型,我们知道事务是一组指令,这些指令在数据库上执行操作。当多个事务同时运行时,需要有一个执行操作的序列,因为一次只能对数据库执行一个操作,这一系列操作称为 调度 。
让我们举个例子来了解 DBMS 中的调度是什么。
DBMS 调度示例
以下操作顺序是调度。这里我们有两个事务T1
和T2
同时运行。
此调度确定将在数据库上执行的操作的确切顺序。在这个例子中,事务T1
的所有指令都在事务T2
的指令之前执行,但是这并不总是必要的,我们可以有各种类型的调度,我们将在本文中讨论。
T1 T2
---- ----
R(X)
W(X)
R(Y)
R(Y)
R(X)
W(Y)
DBMS 中的调度类型
我们在 DBMS 中有各种类型的调度,让我们逐一讨论它们。
串行调度
在串行调度中,在开始执行另一个事务之前完全执行事务。换句话说,您可以说在串行调度中,事务在当前正在运行的事务完成执行之前不会开始执行。这种类型的事务执行也称为非交错执行。我们上面看到的例子是连续调度。
串行调度示例
这里R
表示读操作,W
表示写操作。在此示例中,事务T2
在事务T1
完成之前不会开始执行。
T1 T2
---- ----
R(A)
R(B)
W(A)
commit
R(B)
R(A)
W(B)
commit
严格调度
在严格调度中,如果事务的写入操作先于另一个事务的冲突操作(读取或写入操作),则此类事务的提交或中止操作也应该在其他事务的冲突操作之前。
严格调度示例
假设我们有两个事务Ta
和Tb
。事务Ta
的写入操作在事务Tb
的读取或写入操作之前,因此事务Ta
的提交或中止操作也应该在读取或写入Tb
之前。
Ta Tb
----- -----
R(X)
R(X)
W(X)
commit
W(X)
R(X)
commit
这里,Ta
的写操作W(X)
在Tb
的冲突操作(读或写操作)之前,因此Tb
的冲突操作必须等待Ta
的提交操作。
无级联调度
在无级联调度中,如果事务要对某个值执行读操作,则必须等到执行写入该值的事务提交。
无级联调度示例
例如,假设我们有两个事务Ta
和Tb
。Tb
将在Ta
的W(X)
之后读取值X
,然后Tb
必须在读取X
之前等待事务Ta
的提交操作。
Ta Tb
----- -----
R(X)
W(X)
W(X)
commit
R(X)
W(X)
commit
可恢复的调度
在可恢复调度中,如果事务正在读取已由某个其他事务更新的值,则此事务只能在提交正在更新值的其他事务之后提交。
可恢复调度示例
这里Tb
在Ta
使用W(X)
在X
中进行了更改之后对X
执行读取操作,因此Tb
只能在Ta
的提交操作之后提交。
Ta Tb
----- -----
R(X)
W(X)
R(X)
W(X)
R(X)
commit
commit