2015-04-22 55 views
1

我有一個主存儲過程,它調用多個存儲過程在一次去9到10個多個表上寫數據。一旦所有插入完成,所有插入都會有一個提交。
我想用數據併發性和對各子過程鎖表,它們沒有任何承諾,所以如何在oracle中明確地解鎖鎖定表

LOCK TABLE表名IN LOCK_MODE

將工作,但將持有該表直到其餘的數據被插入在這之後調用的各個表中,並且最終的提交或回滾被調用,這不是一個好主意。我也沒有打開dbms_lock

將鎖定我的主存儲過程中的所有表,或鎖定在各自的子存儲過程中的表是唯一的選擇?

我的主存儲過程是這樣的

PROCEDURE POPULATE_ALL(P_ASOFDATE DATE, P_ENTITY VARCHAR2) IS 
    BEGIN 
     POPULATE_ABC_BOOK(P_ASOFDATE); 
     POPULATE_XYZ(P_ASOFDATE, P_ENTITY); 
     POPULATE_DEF(P_ASOFDATE, P_ENTITY); 
     POPULATE_AAA(P_ASOFDATE, P_ENTITY); 
    commit; 
    EXCEPTION 
    WHEN OTHERS THEN 
     rollback; 
     P_ERROR := SQLERRM; 
     RAISE_APPLICATION_ERROR(-20001, 
           '*** Unexpected Error in POPULATE_ALL -->' || 
           P_ERROR); 
    END POPULATE_ALL; 

其中POPULATE_XYZ被填充XYZ表。

+2

爲什麼你明確地鎖定表在第一個地方?我已經處理了很多Oracle系統,而且我還沒有看到明確表鎖定有用的地方。你有什麼意思讓'dbms_lock'「打開」?你是說因爲某種原因你不允許使用'dbms_lock'嗎?爲什麼你會被允許顯式鎖定一個表,但不能獲取用戶定義的鎖? –

+0

是的,我不允許使用'dbms_lock' – deejay

+0

爲什麼你明確地鎖定表格?爲什麼你會被允許顯式鎖定一個表,但不能獲取用戶定義的鎖? –

回答

0

看起來你根本不需要鎖定。只要做你的插入沒有任何明確的鎖定。

在事務處理過程中無法解鎖表。這個操作在Oracle中沒有任何意義;它只有在數據庫支持髒讀時纔有用。表鎖結束只有

  • 承諾,
  • 回滾或
  • 回滾到保存點鎖建立
  • 執行

之前。

+0

考慮場景...事務T1更改表ABC並將行值插入123 ...第二個事務T2進入,而T1仍在工作。 T2變爲789.T1承諾,一切都很好。 T2發生異常並回滾。但是由於T2將該值更改爲789並且T1已提交。表ABC,123或789中的值是多少?如果它的789,那麼數據會是錯誤的。請解釋 – deejay

+0

@deejay - 我沒有關注。如果T1尚未提交插入,則T2無法看到該行(未提交),因此直到T1提交後才能更新它,因爲直到此時才能看到該行。 –

+0

@deejay,你有沒有聽過[ACID](https://en.wikipedia.org/wiki/ACID)? :)你可以嘗試重現這種情況,你會發現它是不可能的。事務T2在提交T1之前沒有機會更新'行值'。 –