我有一个主存储过程,它调用多个存储过程在一次去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
为什么你明确地锁定表格?为什么你会被允许显式锁定一个表,但不能获取用户定义的锁? –