sourcetip

Oracle에서 프로세스가 두 번 이상 실행되지 않도록 하는 가장 좋은 방법이 있습니까?

fileupload 2023. 7. 22. 10:22
반응형

Oracle에서 프로세스가 두 번 이상 실행되지 않도록 하는 가장 좋은 방법이 있습니까?

예를 들어, 제가.procedure불렀다myproc이는 복잡한 프로세스이므로 두 인스턴스가 동시에 proc를 실행하도록 허용할 수 없습니다.

사실 저는 이걸 사용해서 합니다.dbms_application_info.set_module:

procedure start_process is
begin
  dbms_application_info.set_module('myproc', 'running');
end;

프로세스를 실행하기 전에 확인합니다.

select 'S'
  from v$session v
 where v.module = 'myproc'
   and v.action = 'running';

데이터베이스 수준에서 이를 확인할 수 있는 더 좋은 방법이 있습니까?

dbms_lock.allocate_uniquedbms_lock.request와 함께 사용합니다.사용 노트에는 다음과 같은 내용이 표시됩니다.

새 잠금 이름으로 ALLOAT_UNIQUE를 호출하는 첫 번째 세션에서는 고유한 잠금 ID가 생성되어 dbms_lock_allocated 테이블에 저장됩니다.후속 호출(일반적으로 다른 세션에서)은 이전에 생성된 잠금 ID를 반환합니다.

이게 당신이 노리는 것일 수도 있어요

테이블을 만들 수 있습니다.processes또한 각 프로세스에 일종의 고유 식별자(예: 해시)가 있는지 확인합니다.owner, object_name패키지에서 동적으로 생성할 수 있습니다.

그런 다음 프로세스가 실행될 때 각을 개별적으로 잠그는 함수를 만듭니다.

@Sergio가 코멘트에서 지적했듯이, 어떤 이유로 프로세스 중간에 커밋해야 한다면 - 물론 각 커밋 후에 다시 선택하지 않는 한, 이것은 작동하지 않을 것입니다.

function locking ( Pid ) return number is

   l_locked number := 0;

begin

   select 1
     into l_locked
     from processes
    where id = Pid
         -- exit immediately if the proc is running
      for update nowait
          ;

   return l_locked;

   exception when others then
      return 0;

end;

이렇게 하면 해당 행을 잠글 수 있습니다.processes절차를 현재 실행 중인 세션이 끝날 때까지 사용자를 위해 사용됩니다.

그런 다음 절차에서 이를 마무리합니다.

-- if we failed to lock locking will have thrown an error
-- i.e. we have 0 here.
if locking( 123 ) = 0 then
   exit;
end if;

각 절차에 고유 ID(중요 비트)가 있는 한 절차는 완전히 종료됩니다.


당신의 상황에서는 적용되지 않을 수도 있지만, 저의 일반적인 방법은 사용하는 것입니다.실행 중인 동일한 프로세스 중 2개를 중지하지는 않지만, 1개 이상의 프로세스가 있는 경우 서로 다른 데이터에서만 실행됩니다.다음과 같은 것이 있습니다.

procedure my_procedure ( PNumerator number, PDenominator number ) is

    cursor c_my_cursor ( CNumerator number, CDenominator number ) is
     select columns
       from my_table
      where mod( ascii(substr(id, -1)), CDenominator ) = CNumerator
            ;

begin
   open c_my_cursor( PNumerator, PDenominator );
   ...    
end;

언급URL : https://stackoverflow.com/questions/9825012/is-there-a-best-way-to-avoid-execution-of-process-more-than-once-in-oracle

반응형