【发布时间】:2015-04-22 16:04:42
【问题描述】:
我有一个主存储过程,它调用多个存储过程在多个表上写入数据,一次大约 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 表。
【问题讨论】:
-
你为什么要明确锁定表?我处理过很多 Oracle 系统,但我还没有看到显式表锁定有用的系统。
dbms_lock“打开”是什么意思?您是说出于某种原因不允许使用dbms_lock?为什么允许显式锁定表但不能获取用户定义的锁定? -
是的,我不允许使用
dbms_lock -
你为什么要明确锁定表?为什么允许显式锁定表但不能获取用户定义的锁定?
标签: oracle stored-procedures concurrency