列共享表鎖定(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)。 |