连续执行oracle工作

时间:2014-03-17 18:03:56

标签: oracle11g jobs

我需要在父过程中执行子过程。该子过程独立于父过程,需要并行执行。 要实现并行处理我正在尝试使用dbms作业。我在父进程中提交一个作业来调用子进程,即update_pricerange();。

DBMS_JOB.SUBMIT(99,'update_pricerange('|| num_exchng_rate ||');',sysdate)

这里我只需要执行一次作业,而不是指定刷新间隔。但是,如果我从多个会话中调用我的父进程,则可能会出现问题,即同时调用同一作业的可能性以及update_pricerange()的多个实例;并行执行然后它可能导致死锁或脏数据更新。

所以我想问一下,我是否可以连续执行这项工作,以便连续调用update_pricerange(),并按顺序调用它。

谢谢

1 个答案:

答案 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;

每次在不同的会话中同时调用此过程时,第二个会话将无限期地阻止等待锁定。