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_unique를 dbms_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
'sourcetip' 카테고리의 다른 글
추상 기본 클래스에서 @autowired 사용 (0) | 2023.07.22 |
---|---|
gitam과 git apply의 차이점은 무엇입니까? (0) | 2023.07.22 |
파이썬에서 'r'은 문자열 앞에 무엇을 나타냅니까? (0) | 2023.07.22 |
리눅스 티는 파이썬과 함께 작동하지 않습니까? (0) | 2023.07.22 |
C의 함수에서 재할당을 사용하는 방법 (0) | 2023.07.22 |