2017-02-27 81 views
1

我被困在一種情況下,我正在使用FOR UPDATE SKIP LOCKED的select語句。 下面查詢是一個正被從在RAC環境中運行多個並行Jjobs調用的過程的一部分:FOR UPDATE SKIP LOCKED鎖定表不在select語句中使用Oracle

CURSOR MyCursor IS 
SELECT A.ID, A.NEXTSEQNBR, A.EVENTTYPCD, A.EVMEVENTID , B.EVENTTTIMESTAMP 
FROM Table1 A 
INNER JOIN Table2 B ON A.ID = B.ID 
     AND A.NEXTSEQNBR - 1 = B.SEQNBR 
WHERE B.STATCD = 'MYVAL' 
AND MOD(A.ID, 1) = 0 
FOR UPDATE SKIP LOCKED; 

表1有一個名爲EVENTTYPTABLE1主表。 Table1.EVENTTYPCD列是引用EVENTTYPTABLE1的外鍵。

在生產環境中,我正在檢查鎖定的對象,發現主表EVENTTYPTABLE1被鎖定,即使我在上述查詢中沒有使用主表EVENTTYPTABLE1。由於FOR UPDATE SKIP LOCKED,我期待Table1和Table2表處於鎖定狀態。但爲什麼EVENTTYPTABLE1?我錯過了什麼?

當然光標在過程中被打開和提取。

+0

我現在不是在Oracle實例的前面更完整地回答。但是,從Oracle 11.1.0.6開始,針對子表的DML在父表上採用了「SX」模式的DML鎖。請參閱Oracle支持筆記5909305.8。 –

+0

請分享您所指的點的鏈接。 –

+0

我無法分享鏈接 - 支持說明只能通過Oracle支持網站訪問。您的Oracle許可證應授權您在那裏註冊。 –

回答

2

這取決於您對所選數據所做的操作。你的光標包括外鍵列A.EVENTTYPCD。如果你的進程更新欄,你會看到在父錶行獨佔(RX)AKA subexclusive表(SX)鎖:

LOCK_TYPE LMODE   OBJECT_NAME 
--------- ------------- -------------- 
TM   row-X (SX)  EVENTTYPTABLE1 
TM   row-X (SX)  EVENTTYPTABLE1 
TM   row-X (SX)  TABLE1 
TM   row-X (SX)  TABLE1 
TX   exclusive (X)  

但如果過程不接觸外鍵,你會不會

LOCK_TYPE LMODE   OBJECT_NAME 
--------- ------------- -------------- 
TM   row-X (SX)  TABLE1 
TX   exclusive (X) 

Oracle在11.1.0.6.中引入了這個行爲來修復一個bug。它在Oracle支持筆記5909305.8中有記錄。這是違反Oracle支持T & Cs發佈支持筆記(或任何其他MOS材料)未經甲骨文的許可,但你應該嘗試谷歌搜索它;)