sql—如何在oracle中排队调用存储过程?

quhf5bfb  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(330)

我在oracle中有一个存储过程(如果相关的话,它会安排一个一次性作业来运行另一个过程)。作业调用另一个存储过程,该过程运行几分钟,执行插入、更新和删除,还使用循环。现在,当长过程正在运行时,如果有另一个调用要求它运行,是否可以阻止它们同时执行?更妙的是,让第二个在前一个完成后执行,就像排队一样?

ie3xauqp

ie3xauqp1#

为了防止两个存储过程同时运行,可以使用dbms\u lock来获取独占锁(或者只是尝试更新给定表中的同一行)。

btqmn9zl

btqmn9zl2#

为此,我们设计了dbms\u lock.allocate\u unique过程。
分配一些唯一的 lockname 字符串并在过程中关键序列的开头调用过程。你会得到 lockhandle 作为输出。
那就打电话 DBMS_LOCK.REQUEST 启动唯一处理

DBMS_LOCK.ALLOCATE_UNIQUE( v_lockname, v_lockhandle);    
v_res := DBMS_LOCK.REQUEST( lockhandle=>v_lockhandle, release_on_commit => TRUE);

最后必须释放句柄才能处理下一次运行

v_res :=  DBMS_LOCK.RELEASE (v_lockhandle);

一个好的做法是在异常部分释放它,以便在失败后不被阻塞。
请检查文档中可能的选项,例如 release_on_commit 并根据需要进行调整。
应注意的是 REQUEST 以及 RELEASE 程序。

相关问题