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) | |
提交 |