Mark Harrison Asked: 2015-08-08 18:38:08 +0800 CST2015-08-08 18:38:08 +0800 CST 2015-08-08 18:38:08 +0800 CST Oracle Jobs:我可以创建一个不会与自身重叠的作业吗? 772 如何确保一项作业永远不会运行多个实例? 例如,如果我有一个计划每分钟运行一次的作业,但它实际上运行了三分钟,我不希望该作业的第二个和第三个实例同时启动和运行。 oracle jobs 1 个回答 Voted Best Answer Justin Cave 2015-08-09T08:18:56+08:002015-08-09T08:18:56+08:00 使用dbms_job,您将永远不会同时运行一个作业的两个实例。interval如果我在未来 1 分钟和一个需要 3 分钟运行的过程中做这样的事情 declare l_jobno pls_integer; begin dbms_job.submit( l_jobno, 'begin proc_that_takes_3_minutes(); end;', sysdate, 'sysdate + interval ''1'' minute' ); end; / 该interval表达式仅在前一次运行完成后评估。不会有 3 个作业实例同时运行。该作业将每 4 分钟运行一次。 这就是为什么您经常听到人们说作业随时间“漂移”的原因——作业计划在凌晨 4 点运行,间隔为“sysdate + 1”,因此每天运行的时间稍晚。如果作业需要 1 分钟运行,则在 2 个月后,它现在在凌晨 5 点后运行。这就是为什么interval如果您想每天凌晨 4 点运行,您通常希望您的参数类似于“trunc(sysdate+1) + interval '4' hour”。 如果您想提供额外的保护以防有人试图在作业运行的同时在不同的会话中运行该过程,您可以dbms_lock.request在该过程中调用一个尝试获取用户定义锁的调用做实际工作。 create or replace procedure what_the_job_does as l_status integer; begin l_status := dbms_lock.request( 'MY_LOCK_NAME' ); if( l_status in (1,4) ) then <<do actual work>> end if; end;
使用
dbms_job
,您将永远不会同时运行一个作业的两个实例。interval
如果我在未来 1 分钟和一个需要 3 分钟运行的过程中做这样的事情该
interval
表达式仅在前一次运行完成后评估。不会有 3 个作业实例同时运行。该作业将每 4 分钟运行一次。这就是为什么您经常听到人们说作业随时间“漂移”的原因——作业计划在凌晨 4 点运行,间隔为“sysdate + 1”,因此每天运行的时间稍晚。如果作业需要 1 分钟运行,则在 2 个月后,它现在在凌晨 5 点后运行。这就是为什么
interval
如果您想每天凌晨 4 点运行,您通常希望您的参数类似于“trunc(sysdate+1) + interval '4' hour”。如果您想提供额外的保护以防有人试图在作业运行的同时在不同的会话中运行该过程,您可以
dbms_lock.request
在该过程中调用一个尝试获取用户定义锁的调用做实际工作。