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

    在多使用者的資料庫(Multi-user Database) 中,一般都採取某些資料鎖定(Locks) 來解決並行處理(Concurrency) 中資料的一致性(Consistency) 與整合性(Integrity) 問題。鎖定(Locks) 是防止存取同一資料的使用者之間的破壞性干擾,該干擾是指不正確地修改資料,如同前面介紹的例子,因沒有做好並行控制(Concurrency Control) 所造成問題:(1) 遺失更新問題(Lost Update Problem)、(2) 未委付確認相依問題(Uncommitted Dependency Problem)、(3) 不一致分析問題(Inconsistent Analysis Problem)。

   

鎖定(Lock)方式如下:

  1. 互斥鎖定(Exclusive Lock):它禁止相關資源共享。如果一異動交易以互斥鎖定方式封鎖某資源,則僅有該異動交易被允許更新該資源的資料,直到該異動交易釋放對該資源的鎖定。

  2. 共享鎖定(Share Lock):它允許相關資源可以被共享(Share),例如:多個使用者可以讀取(Read) 相同的資料。多個異動交易可以對同一資源獲得共享鎖定。

 

    一般而言,共享鎖定(Share Lock) 比互斥鎖定(Exclusive Lock) 具有更高的資料並行性(Data Concurrency)。在多使用者資料庫系統使用鎖定法(Locks),有時會產生死結(Dead Lock),使得異動交易無法繼續。死結例子如下:

   
 

    在時間點t1時,異動交易T1成功地更新了SCOTT的Emp表格中empno為7844的列(Row),並且加以互斥鎖定;在時間點t2時,異動交易T2也成功地更新了SCOTT的EMP表格empno為7839的列,並且加以互斥鎖定;在時間點t3,異動交易T1嘗試更新目前異動交易T2所互斥鎖定的列,但因為該列已被鎖定,因此T1必須等待T2釋放該列;在時間點t4,異動交易T2嘗試更新目前異動交易T1所互斥鎖定的列,但因該列已被鎖定,因此T2必須等待T1釋放該列。此時已造成死結。ORACLE系統一旦偵測到死結,會送出錯誤訊息給其中一個異動交易。

 

    雖然ORACLE系統並不提升鎖定的層次,但是在某些資料庫系統,一旦異動交易有許多同一層次的鎖定,那麼資料庫系統會自動地改變鎖定的程度到更高層次的鎖定。例如,若某一使用者同時對同一個表格中的不同列做鎖定,資料庫系統可能會自動地提升鎖定層次,由原本的列鎖定(Row Lock)提升為表格鎖定(Table Lock)。利用這種提升鎖定層次的方式,使得鎖定的數目可以減少,但是也因為鎖定層次提高而增加了限制。鎖定的提升(Lock Escalation),一般而言會增加死結的發生率。

 

    ORACLE系統利用不同層次的鎖定、異動交易與多層次一致性模式(Multi-version Consistency Model) 來維持系統的並行性(Concurrency)、整合性(Integrity) 與一致性(Consistency),在一個異動交易A中,SQL指令所做的更新資料部分,只有在該異動交易A被委付確認之後才啟動的異動交易才能看見。而在異動交易中,所獲得的全部鎖定,會在該異動交易被委付確認或撤回時被釋放(UnLock)。

 

    異動交易執行的過程中,所用到的資料或所產生的中間結果,都不能透露給其它異動交易讀取或更改,稱之為異動交易的「隔離性」。因為任何異動交易在委付確認前都有可被撤回,為了避免其他異動交易B,會因使用異動交易A所產生的中間結果。但因事後該異動交易A撤回而導致「連鎖撤回效應」(Cascading Rollback)。因此異動交易間彼此是隔離的。也就是說,正常性況下通常會有許多異動交易是並行執行,但是每個異動交易的更新對其他異動交易而言都是隱藏的,直到該異動交易被委付確認為止。換句話說,對於任意兩個不同的異動交易T1與T2的更新,T1可能可以看到T2的更新在T2被委付確認後;或者T2可能可以看到T1的更新,在T1被委付確認後,但是絕對不可能T1與T2同時都可看到對方的更新。

   

多層次一致性模式(Multi-version Consistency Model),所提供的兩種讀取一致性層次:

 
    • 敘述層級讀取一致性(Statement-level Read Consistency)
    • 異動交易層級讀取一致性(Transaction-level Read Consistency)
 

    ORACLE系統通常實施敘述層級讀取一致性,以保證個別查詢所傳回的資料與該查詢開始時一致。因此一個查詢從不會看到查詢過程中其他異動交易所做的委付確認的任何更新資料。為了實現敘述層級讀取一致性,當某查詢進入執行階段時,ORACLE會記住目前的系統修改號碼(System Change Number,SCN),當查詢執行時,只有在ORACLE系統記住系統修改號碼(SCN) 時候之前所做的委付確認的更新資料才是有效。也就是說,查詢看不到查詢執行開始之後其他異動交易所做的任何委付確認的資料。

 
 

    在例子中異動交易T3與T4分別在時間點t1、t2查詢相同的資料(SCOTT的表格EMP中 EMPNO為7839的薪資),其結果為5100,然而異動交易T3在時間點t3更新(Update)了資料為 5000,也就是將EMPNO的薪資(SAL)減去100,並於時間點t4做了相同的查詢,其結果為更新後的結果(5000)。但是異動交易T2 於時間點t5做了與時間點t2相同的查詢,其結果仍舊的資料(5100)。這是因為異動交易T1並未將更新的資料(5000) 做委付確認,所以,異動交易T2並看不到此更新資料,因此查詢結果仍為5100。後來,異動交易T1於時間點t6做了委付確認,因此異動交易T2於時間點t7所做的查詢中,可以看到T1更新後且委付確認的資料(5000)。

 
 

    ORACLE允許選擇實施異動交易層級讀取一致性,它保證在同一個時間點,同一個異動交易內的所有查詢的資料是一致的。因此異動交易層級讀取一致性可以允許重覆性的讀取,仍保證資料的一致性。ORACLE系統可利用以下兩種不同的方法保證異動交易層次讀取一致性:

 
  • 唯讀異動交易(Read–only Transaction):此種異動交易只能包含查詢指令而不能包含其他任何DML 指令。為了在唯讀異動交易中提供重覆讀取一致性,ORACLE系統注意每個異動交易的起始點,在該異動交易過程間,只有該異動交易開始之前做委付確認的資料才是有效的。

  • 互斥表鎖定與列鎖定(Exclusive Table and Row Lock):如果一個包含DML指令的異動交易需要重覆讀取資料,那麼該異動交易對於那些需要被讀取資料的表格,可以利用外顯式鎖定(Explicit Lock)指令來獲得表格的共享鎖定(Share Lock)或是列的互斥鎖定(Exclusive Lock)。這種方法可提供異動交易層級讀取一致性,但也會降低資料並行存取的程度。

 
 

    查詢開始時,系統會記住查詢時的SCN,查詢過程中只有該SCN的資料區塊(Data Block)會被讀取,其中包括回復段中的存取更新前資料的資料區塊(Data Block),如此就可以保留重覆讀取的一致性了。