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

    ORACLE會自動地使用不同的鎖定來控制資料的並行存取(Concurrency Access)以防止使用者間的破壞性干擾。ORACLE系統會自動地鎖定某一資源以防止其他異動交易對同一資源的互斥鎖定(Exclusive Lock)。當某些特定事件(event)發生或異動交易不再需要該資源時,異動交易會自動地解除該鎖定。  

 

    ORACLE的鎖定機制是自動地並不需要使用者特意的執行鎖定指令。內隱式鎖定(Implicit Lock)是因為使用者執行SQL指令而使用了某些系統資源,ORACLE系統根據 SQL指令之需要自動地使用不同層級的鎖定。ORACLE系統將鎖定分成以下幾種:

 
資料鎖定(Data Lock)

資料鎖定保護資料。其中包括了表格鎖定與列鎖定。表格鎖定鎖住整個表格,列鎖定鎖定了所選定的列。資料鎖定亦稱為DML鎖定(DML Lock)。

 
資料字典鎖定(Dictionary Lock)

資料字典鎖定保護資料庫物件的結構,例如表格與視觀表格(View)等的定義。資料字典鎖定亦稱為DDL鎖定(DDL Lock)。

 
內部鎖定(Internal Lock)

內部鎖定保護內部資料庫結構,例如:檔案。這類鎖定是完全自動地設定。

 
分散式鎖定(Distributed Lock)

分散式鎖定確保資料或資源在多個不同版本的ORACLE平行伺服器中保持資料一致性。

 
平行緩衝管理鎖定(Parallel Cashe Management Lock)

平行緩衝管理鎖定是種分散式鎖定,它涵蓋了緩衝區(Buffer)中一個或多個資料區塊(Data Block)。亦稱PCM Lock。

 
 

資料鎖定保護表格資料,並確保多個使用者平行存取資料時的資料整合性(Data Integrity)。資料鎖定防止相衝突的DML和DDL操作的破壞性干擾。DML操作能獲得兩種等級的鎖定:特定列鎖定(Row Locks)與整個表鎖定(Table Locks)。

 
 

當某特定列被以下的指令所更新時要實施列鎖定(Row Locks):INSERT,UPDATE,DELETE與包含FOR UPDATE 子句的SELECT指令。列鎖定一定是互斥鎖定(Exclusive Lock),因此其他使用者無法更新此列,直到這擁有此列鎖定的異動交易委付確認或回復。

 

表鎖定(Table Lock) 可以分成以下方式:

 
列共享表鎖定(Row Share Table Lock,RS):
 

當一異動交易欲企圖更新某特定列時,可設定此種鎖定,以防止其他異動交易更新那些特定列。此種鎖定會因為下列指令而自動設定:

  • SELECT… FROM <表格名>…… FOR UPDATE OF ………
  • LOCK TABLE <表格名> IN ROW SHARE MODE
 

列共享表鎖定是種限制最少的表鎖定,它允許較高程度的表格並行處理(Concurrency),並允許其他異動交易對被列共享表鎖定的列(Rows)做平行查詢,或者是對其他的列執行查詢、新增、刪除、修改和列鎖定等指令。因此,其他的異動交易可同時對此表格設定相同的列共享(RS)、列互斥(RX)、共享(S)或共享列互斥(SRX)等表鎖定。但是禁止其他異動交易對此表格設定為互斥表鎖定(X)。有時此種表鎖定亦被稱為局部共享表鎖定(Sub-share Table Lock,SS)或稱為意圖共享鎖定(Intent Share Lock,IS)。

 

利用SELECT … FOR UPDATE OF ……自動設定列共享表鎖定。

例子中表格 EMP 中的 JOB 為‘CLERK’的列被設成列共享表鎖定(RS),此時其他的異動交易可以執行 SELECT 查詢指令或對其他 JOB 不是‘CLERK’的記錄做新增(INSERT)、刪除(DELECT)、修改(UPDATE) 指令。此種為內隱式(Implicit) 的表鎖定。

 

利用 LOCK TABLE … IN SHARE MODE 來設定列共享表格鎖定。

此種為外顯式(Explicit) 表鎖定。

 
列互斥表鎖定(Row Exclusive Table Lock,RX):
 

此種表鎖定表示該異動交易對某些特定列做過一次或多次更新的動作。此鎖定會因下列指令而自動設定:

  • INSERT INTO <表格名> ……
  • UPDATE <表格名> ……
  • LOCK TABLE <表格名> IN ROW EXCLUSIVE MODE
 

當一個異動交易設定列互斥表鎖定時,允許其他的異動交易對於其他非鎖定列做查詢、新增、刪除、修改或列鎖定等指令。但是禁止其他的異動交易同時對相同表格執行以下的鎖定:

  • LOCK TABLE <表格名> IN SHARE MODE
  • LOCK TABLE <表格名> IN SHARE ROW EXCLUSIVE MODE
  • LOCK TABLE <表格名> IN EXCLUSIVE MODE
 
共享表鎖定(Share Table Lock,S):
 

當執行下列的指令時,會自動設定該表格為共享表鎖定(S):

  • LOCK TABLE <表格名> IN SHARE MODE
 

當一異動交易設定某一表格為共享表鎖定時,則允許其他異動交易在該表格上執行查詢與執行SELECT…FOR UPDATE等列共享表鎖定(RS)指令去鎖定某特定列或是執行LOCK…IN SHARE MODE等共享表鎖定(S)指令,但是不允許其他異動交易更改表格中的值。若在某一表格中,只有一個異動交易A持有該表格的共享表鎖定(S),則該異動交易A可提昇(Promote)鎖定的層級,例如:提昇到共享列互斥表鎖定(SRX)或互斥表格鎖定(X)的層級,使得異動交易A可修改表格中資料。當某一表格上有多個異動交易設定共享鎖定(S),則任何異動交易不可以在該表格上新增、修改或刪除表格上的列。也就是說,當多個異動交易設定了某表格為共享表鎖定(S),則沒有任何異動交易可修改該表格。共享表鎖定可防止其他異動交易修改同一表格。如果異動交易在某一表格上設定共享鎖定(S),則將禁止其他的異動交易執行以下的指令:

  • LOCK TABLE <表格名> IN SHARE ROW EXCLUSIVE MODE
  • LOCK TABLE <表格名> IN EXCLUSIVE MODE
  • LOCK TABLE <表格名> IN ROW EXCLUSIVE MODE
 
共享列互斥表鎖定(Share Row Exclusive Table Lock,SRX):
 

它比共享表鎖定(S)具有更多限制,當異動交易執行以下的指令時會自動地設定該表格為共享列互斥表格鎖定:

  • LOCK TABLE <表格名> IN SHARE ROW EXCLUSIVE MOD
 

若一異動交易在某表格上設定為共享列互斥表格鎖定,則只允許其他的異動交易執行查詢或利用SELECT …… FOR UPDATE去鎖定某特定列,但並不允許修改表格。

 

當某異動交易獲得某一表格的共享列互斥表鎖定,可防止其他異動交易再獲互斥表鎖定(X)或列互斥表鎖定(RX)而修改同一表格資料。當表格被某一異動交易設定為共享列互斥表格鎖定時,任何其他的異動交易不可以做新增、更新、或刪除表格中的任何列,並且禁止任何其他的異動交易對同一表格獲得共享表鎖定(S)、共享列互斥表(SRX)、列互斥表鎖定(RX)與互斥表鎖定(X),和禁止其執行以下指令:

  • LOCK TABLE <表格名> IN SHARE MODE
  • LOCK TABLE <表格名> IN SHARE ROW EXCLUSIVE MODE
  • LOCK TABLE <表格名> IN ROW EXCLUSIVE MODE
  • LOCK TABLE <表格名> IN EXCLUSIVE MODE
 
互斥表格鎖定(Exclusive Table Lock,X):
 

此種為限制最嚴格的表鎖定,它允許獲得此鎖定的異動交易對該表格做存取。當異動交易執行以下的指令時會自動地獲得互斥表鎖定(X):

  • LOCK TABLE <表格名> IN EXCLUSIVE MODE
 

在同一表格只有一個異動交易可獲得互斥表鎖定(X)。其他的異動交易僅被允許查詢同一表格,但不允許其對同一表格執行任何資料操作語言(DML)指令 (例如:INSERT、DELETE、UPDATE等指令) 和任何程度的表鎖定(例如:S,RS,SRX或X等表鎖定)。

 
 

對SCOTT.EMP表格做互斥表鎖定(Exclusive Lock)。

 

利用SELECT … FOR UPDATE的例子一。

在例子中,只有對 EMP 表格與 DEPT 表格中符合關聯條件與“LOC=‘NEW YORK’”條件的列,做列共享表鎖定(RS)。

 

利用SELECT … FOR UPDATE的例子二。

在例子中,只有對EMP表格中符合關聯條件與“LOC=‘NEW YORK’”條件的列,做列共享鎖定(RS),值得注意的是,對表格DEPT並未做任何鎖定。

 

某異動交易A因DML指令(例如:Insert,Update,Delete等指令)而對某表格設定列鎖定,若其他異動交易B也想要對已鎖定的列做更新,必須等到異動交易A執行委付確認或是回復等指令才能執行。在同一個異動交易中,可以看到前面執行的DML指令所改變後的資料,但是卻看不見其他異動交易中尚未委付確認的資料。有時候ORACLE系統會因應未來的需要,自動地將鎖定(Lock)由較低的層級提昇為較高的層級。例如:一個異動交易A執行包含FOR UPDATE參數的SELECT查詢指令,會得到列共享表鎖定(RS),若異動交易A更新其中被列鎖定的列時,則原來的列共享表鎖定(RS)會自動地提昇為互斥表鎖定(RX)。