Oracle11g 连续执行oracle作业

Oracle11g 连续执行oracle作业,oracle11g,jobs,Oracle11g,Jobs,我需要在父过程中执行子过程。此子过程独立于父过程,需要并行执行。 为了实现并行处理,我正在尝试使用dbms作业。我正在提交父过程中的作业,以调用子进程ie update_pricerange() DBMS|u JOB.SUBMIT(99,'update|u pricerange('num|u exchng|u rate | |');',sysdate) 在这里,我必须只执行一次作业,而不是指定刷新间隔。但在这里,如果我从多个会话调用我的父进程,那么问题可能会出现,有可能同时调用同一个作业,并且如

我需要在父过程中执行子过程。此子过程独立于父过程,需要并行执行。 为了实现并行处理,我正在尝试使用dbms作业。我正在提交父过程中的作业,以调用子进程ie update_pricerange()

DBMS|u JOB.SUBMIT(99,'update|u pricerange('num|u exchng|u rate | |');',sysdate)

在这里,我必须只执行一次作业,而不是指定刷新间隔。但在这里,如果我从多个会话调用我的父进程,那么问题可能会出现,有可能同时调用同一个作业,并且如果有多个update_pricerange()实例;如果并行执行,则可能导致死锁或脏数据更新

因此,我想问一下是否可以串行执行此作业,以便可以串行调用update_pricerange(),也可以按调用顺序调用它


谢谢

如果要确保
update\u pricerange
不会同时执行多次,最简单的选择是使用
dbms\u lock
包在
update\u 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;
创建或替换过程更新\u价格范围
作为
l_lock_name varchar2(30):=“我的锁_name”;
l_锁柄varchar2(128);
l_状态整数;
开始
dbms_lock.allocate_unique(l_lock_name,
l_锁(u手柄);;
l_status:=dbms_lock.request(l_lock_handle);
如果(l_状态=1)
然后
RAISE_应用程序_错误(-20001,'等待'| | l|锁定_名称的超时);
ELSIF(l_状态=2)
然后
引发应用程序错误(-20002,‘死锁等待’| | l|锁_名称);
ELSIF(l_状态=3)
然后
引发应用程序错误(-20003,'参数错误等待'| | l|锁定_名称);
ELSIF(l_状态=5)
然后
RAISE_应用程序_错误(-20005,“非法锁句柄”| | l_锁_名称);
如果结束;
dbms_lock.release(l_lock_句柄);
结束;

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

我不确定是否理解此问题。它是否可以归结为“我可以确保在任何时间点上最多运行一个
update\u pricerange
实例吗?”是的,justin,这就是我想要的感谢justin,太好了。但更新价格范围的执行顺序也很重要。那么,等待会话会按照请求的顺序获得锁吗?Thanx@user621409-为什么通话顺序很重要?您没有向过程传递任何参数,因此如何区分对过程的两个不同调用?您意识到每个作业都将在一个单独的会话中运行,不知道是哪个会话产生了它,也无法读取父会话所做的未提交的更改,对吗?是的,我在问题中没有提到bt,我正在传递一个数字变量来更新\u pricerange。@user621409-这个数字代表什么?这不会导致过程更新一组不同的行吗?为什么顺序很重要?什么决定了顺序?当调用
dbms\u作业.submit
时?调用事务何时提交?工作是什么时候开始的?何时调用了
dbms\u lock.request
?在我们到达
dbms\u锁之前,这里有很多潜在的竞争条件。请求
调用。这里的数字将用于计算目的,同一行将得到更新。顺序是在调用作业时。。