본문 바로가기

ORACLE/Admin

ORACLE DBMS_JOB 동시 수행 테스트

728x90
반응형

ORACLE 에서 어떤 JOB의 수행이 끝나지 않은 상태에서 다음 수행시간이 되었을 때 어떻게 수행이 되는지 테스트해보았다. 테스트 환경은 RDS for Oracle 19.13.0.0 버전이다. 

 

 

테스트 목표

  1. 같은 JOB이 동시에 실행되는지 확인
  2. 실행 중인 JOB이 끝나지 않았을 때 다음 실행이 시작되는지 확인

 

테스트 방법

수행시간이 2분 소요되는 프로시저를 1분 간격으로 수행되도록 job 등록하여

수행 시작 시간과 종료 시간을 확인한다.

 

 

 

1. 테스트 테이블 생성

작업 상태를 기록할 테이블을 생성한다.

CREATE TABLE job_test_log (
    log_time   TIMESTAMP,
    job_id     NUMBER,
    message    VARCHAR2(100)
);

 

 

2. 테스트 프로시저 생성

작업 시작 시 테스트 테이블에 시작 로그를 기록하고, 2분 간 대기 후 테스트 테이블에 종료 로그를 기록하는 프로시저를 생성한다.

CREATE OR REPLACE PROCEDURE test_job_procedure IS
BEGIN
    INSERT INTO job_test_log (log_time, job_id, message)
    VALUES (SYSTIMESTAMP, USERENV('SESSIONID'), 'Job started');
    COMMIT;
   
    DBMS_LOCK.SLEEP(120); -- 2분간 대기
    
    INSERT INTO job_test_log (log_time, job_id, message)
    VALUES (SYSTIMESTAMP, USERENV('SESSIONID'), 'Job completed');
    COMMIT;
    
END;

 

 

3. JOB 등록

테스트 프로시저가 1분 간격으로 수행되도록 JOB을 등록한다.

DECLARE
    X NUMBER;
BEGIN
    DBMS_JOB.SUBMIT(
        job        => X,
        what       => 'test_job_procedure;',
        next_date  => SYSDATE,
        interval   => 'SYSDATE + 1/1440' -- 1분 간격으로 실행
    );
    COMMIT;
END;
/

 

4. 수행 결과

테스트 테이블을 조회해보면 아래와 같은 로그를 확인할 수 있다.

job에 설정한 대로라면 50분에 첫 번째 수행(1) 시작 후 51분에 두 번째 수행이 되었어야 하는데,

51분에 두 번째 수행이 시작되지 않았다.

첫 번째 수행이 완전히 끝난 후(2) 두 번째 수행이 시작(3) 된 것을 확인할 수 있다.

 

 

결론

이 테스트를 통해 DBMS_JOB이 동시 수행을 방지하는 것을 확인할 수 있다.

환경에 따라 다를 수 있으니 직접 테스트 하는 것을 추천한다.

728x90
반응형