9-1資料並行性與資料一致性 9-2常見的並行控制問題  
9-3排程(Schedule)的概念 9-4鎖定(Locks)  
9-5ORACLE的鎖定機制  
   
 

    序列化排程(Serial Schedule):所謂序列化排程(Serial Schedule) 是指一個異動交易(Transaction) 緊接著另一個異動交易循序地執行,而不相互交叉執行。假設有異動交易 T1,T2 和 T3,則有以下 6 種序列化排程:(T1,T2,T3)、(T1,T3,T2)、(T2,T1,T3)、(T2,T3,T1)、(T3,T1,T2)、(T3,T2,T1)。

 

    序列化排程對於資料庫一致性的意義:一個一致性的資料庫經過任何序列化排程運作後,該資料庫還是合乎一致性的。因為一個一致性的資料庫在異動交易的執行前後都會保持一致性。因此一個一致性的資料庫在經過序列化排程如(T1,T2,T3) 運作後,該資料庫仍保持一致性。

 

    但是,序列化排程卻犧牲了系統的效能,使得異動交易必須依某一序列化排程執行,讓原本可以並行處理的部份必須等待前一異動交易完成後才能開始。但是在現實的系統而言,這是不可能的。所以就出現了非序列化排程(Non-serial Schedule)。

 

    非序列化排程(Non-serial Schedule):是指多個異動交易同時交錯地執行,然而個別異動交易內各動作(Action),仍遵守它在該異動交易內的先後順序。假設兩種異動交易 T1,T2 其中 T1 有 X1,X2 兩個動作(Action),T2 有 Y1,Y2 兩個動作,則它們有 (X1 , X2 , Y1 , Y2)、(X1 , Y1 , X2 , Y2)、(X1 , Y1 , Y2 , X2)、(Y1 , X1 , Y2 , X2)、(Y1 , X1 , X2 , Y2)、(Y1 , Y2 , X1 , X2) 等 6 種非序列化排程。雖然非序列化排程可使多個異動交易並行處理,但是卻不能保證資料庫系統的一致性,前面三個並行控制的常見問題,即是最好的例子。因此,我們若能有一非序列化排程,其執行結果與序列化排程執行的結果一樣的話,則我們一定可能確保該排程必能保持資料庫的一致性。

 

    可序列化排程(Serializable Schedule):若一非序列化排程(Non-serial Schedule),其執行結果與任一個序列化(Serial Schedule)的執行結果相同,則該非序列化排程稱為“可序列化排程”(Serializable Schedule)。例子如下:

 
 

    假設X,Y在時間點t1時為10,在時間點t12時,結果是X與Y皆為25。這樣子的結果與序列化排程(TA,TB)相同。所以根據定義,此為可序列化排程。

 

    雖然我們知道可序列化排程(Serializable Schedule) 可保證多個異動交易的執行前後資料庫的一致性。但是在實際上從多個異動交易中找一個可序列化排程是不可行的。主要是因為從眾多的非序列化排程找出個可序列化排程太費時間了,再者即使能找出一個可序列化排程,但是實際上系統會因考慮資源的運用等問題,而不一定會按照該排程來執行,而且,我們也無法在執行之前“預知”所有異動交易。因此,我們大多利用以下的方法解決:

  • 延遲某些異動交易的動作以避免不一致性或運算結果喪失的情況發生。這種方法稱為資料鎖定(Lock)。

  • 讓異動交易同時運作,但當我們發現了某個異動交易產生問題時,我們就取消該異動交易,然後再重新執行該異動交易,此為時間標記(Timestamp)。