SW/Database / / 2025. 2. 16. 11:36

ORA-04021: Timeout occurred while waiting to lock object / 원인과 해결 방법

반응형

ORA-04021: Timeout occurred while waiting to lock object

ORA-04021 오류는 다른 세션에서 객체를 잠그고 있어 일정 시간 내에 해당 객체의 잠금을 얻지 못했을 때 발생합니다.

 

 

ORA-04021: Timeout occurred while waiting to lock object / 원인과 해결 방법

 

 

원인

ORA-04021 오류는 다음과 같은 원인으로 인해 발생할 수 있습니다.

  1. 다른 세션에서 객체를 잠그고 있는 경우: - PL/SQL 패키지, 함수, 프로시저 또는 기타 객체가 다른 세션에서 사용 중일 때 발생합니다.
  2. DDL(예: `ALTER`, `DROP`)을 수행할 때 객체가 잠겨 있는 경우: - 사용 중인 객체를 수정하려고 하면 충돌이 발생할 수 있습니다.
  3. 오래 실행되는 트랜잭션이 잠금을 유지하고 있는 경우: - 특정 세션에서 긴 트랜잭션을 수행하고 있을 때, 다른 세션에서 같은 객체에 접근하려 하면 타임아웃이 발생할 수 있습니다.
  4. 시스템이 높은 부하 상태일 때: - 세션이 많거나 리소스가 부족하여 객체 잠금 해제가 지연될 수 있습니다.

해결 방법

ORA-04021 오류를 해결하려면 다음 방법을 시도해 보세요.

  1. 잠금을 유지하는 세션 확인 및 강제 종료: - `V$SESSION` 및 `V$LOCK` 뷰를 사용하여 어떤 세션이 객체를 잠그고 있는지 확인합니다.
    SELECT s.sid, s.serial#, s.username, l.OBJECT_ID, o.object_name, o.object_type
    FROM v$locked_object l
    JOIN dba_objects o ON l.object_id = o.object_id
    JOIN v$session s ON l.session_id = s.sid;
    - 잠금을 해제하려면 세션을 종료합니다.
    ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;
  2. 오래 실행 중인 트랜잭션 종료: - `V$TRANSACTION`을 확인하고 오래된 트랜잭션을 롤백합니다.
    SELECT ses.sid, ses.serial#, trx.start_time
    FROM v$transaction trx
    JOIN v$session ses ON trx.ses_addr = ses.saddr;
    - 특정 트랜잭션을 종료하려면 다음 명령어를 사용합니다.
    ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;
  3. DDL 실행 전 객체가 사용 중인지 확인: - `DBA_OBJECTS`를 조회하여 해당 객체가 사용 중인지 먼저 확인한 후 DDL을 실행하세요.
  4. DBMS_LOCK.RELEASE를 사용하여 수동으로 잠금 해제: - `DBMS_LOCK` 패키지를 활용하여 불필요한 잠금을 해제할 수 있습니다.
  5. 타임아웃 설정 증가: - PL/SQL 코드에서 `DBMS_LOCK.SLEEP`을 사용하여 일정 시간 후 다시 시도하는 로직을 추가할 수 있습니다.

요약

  • ORA-04021 오류는 다른 세션이 객체를 잠그고 있어 일정 시간 내에 잠금을 얻지 못했을 때 발생합니다.
  • 해결 방법: - `V$SESSION`, `V$LOCK`을 조회하여 잠금 세션을 찾고 종료 - 오래 실행 중인 트랜잭션을 롤백 - DDL 실행 전에 객체 사용 여부 확인 - `DBMS_LOCK.RELEASE`로 강제 잠금 해제 - 타임아웃을 증가하거나 재시도 로직 추가
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유