我需要在父过程中执行子过程。该子过程独立于父过程,需要并行执行。 要实现并行处理我正在尝试使用dbms作业。我在父进程中提交一个作业来调用子进程,即update_pricerange();。
DBMS_JOB.SUBMIT(99,'update_pricerange('|| num_exchng_rate ||');',sysdate)
这里我只需要执行一次作业,而不是指定刷新间隔。但是,如果我从多个会话中调用我的父进程,则可能会出现问题,即同时调用同一作业的可能性以及update_pricerange()的多个实例;并行执行然后它可能导致死锁或脏数据更新。
所以我想问一下,我是否可以连续执行这项工作,以便连续调用update_pricerange(),并按顺序调用它。
谢谢
答案 0 :(得分:1)
如果您想确保update_pricerange
未同时多次执行,最简单的选择是使用dbms_lock
包在update_pricerange
中创建和获取用户定义的锁定。所以,例如
CREATE OR REPLACE PROCEDURE update_pricerange
AS
l_lock_name varchar2(30) := 'MY_LOCK_NAME';
l_lock_handle varchar2(128);
l_status integer;
<<current declarations>>
BEGIN
dbms_lock.allocate_unique( l_lock_name,
l_lock_handle );
l_status := dbms_lock.request( l_lock_handle );
IF( l_status = 1 )
THEN
RAISE_APPLICATION_ERROR( -20001, 'Timeout waiting for ' || l_lock_name );
ELSIF( l_status = 2 )
THEN
RAISE_APPLICATION_ERROR( -20002, 'Deadlock waiting for ' || l_lock_name );
ELSIF( l_status = 3 )
THEN
RAISE_APPLICATION_ERROR( -20003, 'Parameter error waiting for ' || l_lock_name );
ELSIF( l_status = 5 )
THEN
RAISE_APPLICATION_ERROR( -20005, 'Illegal lock handle ' || l_lock_name );
END IF;
<<do stuff>>
dbms_lock.release( l_lock_handle );
END;
每次在不同的会话中同时调用此过程时,第二个会话将无限期地阻止等待锁定。