我在oracle中有一个存储过程(如果相关的话,它会安排一个一次性作业来运行另一个过程)。作业调用另一个存储过程,该过程运行几分钟,执行插入、更新和删除,还使用循环。现在,当长过程正在运行时,如果有另一个调用要求它运行,是否可以阻止它们同时执行?更妙的是,让第二个在前一个完成后执行,就像排队一样?
ie3xauqp1#
为了防止两个存储过程同时运行,可以使用dbms\u lock来获取独占锁(或者只是尝试更新给定表中的同一行)。
btqmn9zl2#
为此,我们设计了dbms\u lock.allocate\u unique过程。分配一些唯一的 lockname 字符串并在过程中关键序列的开头调用过程。你会得到 lockhandle 作为输出。那就打电话 DBMS_LOCK.REQUEST 启动唯一处理
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 程序。
release_on_commit
REQUEST
RELEASE
2条答案
按热度按时间ie3xauqp1#
为了防止两个存储过程同时运行,可以使用dbms\u lock来获取独占锁(或者只是尝试更新给定表中的同一行)。
btqmn9zl2#
为此,我们设计了dbms\u lock.allocate\u unique过程。
分配一些唯一的
lockname
字符串并在过程中关键序列的开头调用过程。你会得到lockhandle
作为输出。那就打电话
DBMS_LOCK.REQUEST
启动唯一处理最后必须释放句柄才能处理下一次运行
一个好的做法是在异常部分释放它,以便在失败后不被阻塞。
请检查文档中可能的选项,例如
release_on_commit
并根据需要进行调整。应注意的是
REQUEST
以及RELEASE
程序。