我有一個主存儲過程,它調用多個存儲過程在一次去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表。
爲什麼你明確地鎖定表在第一個地方?我已經處理了很多Oracle系統,而且我還沒有看到明確表鎖定有用的地方。你有什麼意思讓'dbms_lock'「打開」?你是說因爲某種原因你不允許使用'dbms_lock'嗎?爲什麼你會被允許顯式鎖定一個表,但不能獲取用戶定義的鎖? –
是的,我不允許使用'dbms_lock' – deejay
爲什麼你明確地鎖定表格?爲什麼你會被允許顯式鎖定一個表,但不能獲取用戶定義的鎖? –