如何在oracle

时间:2015-04-22 16:04:43

标签: oracle stored-procedures concurrency

我有一个主存储过程,它调用多个存储过程来在多个表上写入数据,一次性大约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表。

1 个答案:

答案 0 :(得分:0)

看起来你根本不需要锁定。只需插入而不需要任何显式锁定。

在交易过程中无法解锁表格。这个操作在Oracle中没有任何意义;仅当数据库支持脏读时才有用。表锁定仅在

时结束
  • 提交,
  • 回滚或
  • 在锁定建立之前回滚到保存点

执行。