我有一个主存储过程,它调用多个存储过程来在多个表上写入数据,一次性大约9-10。完成所有插入操作后,所有插件都会有一个提交 我想在单个子程序中使用数据并发和锁定表,这些程序没有任何提交,所以
LOCK TABLE table_name 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表。
答案 0 :(得分:0)
看起来你根本不需要锁定。只需插入而不需要任何显式锁定。
在交易过程中无法解锁表格。这个操作在Oracle中没有任何意义;仅当数据库支持脏读时才有用。表锁定仅在
时结束执行。