반응형
ORA-04021: Timeout occurred while waiting to lock object
ORA-04021 오류는 다른 세션에서 객체를 잠그고 있어 일정 시간 내에 해당 객체의 잠금을 얻지 못했을 때 발생합니다.
원인
ORA-04021 오류는 다음과 같은 원인으로 인해 발생할 수 있습니다.
- 다른 세션에서 객체를 잠그고 있는 경우: - PL/SQL 패키지, 함수, 프로시저 또는 기타 객체가 다른 세션에서 사용 중일 때 발생합니다.
- DDL(예: `ALTER`, `DROP`)을 수행할 때 객체가 잠겨 있는 경우: - 사용 중인 객체를 수정하려고 하면 충돌이 발생할 수 있습니다.
- 오래 실행되는 트랜잭션이 잠금을 유지하고 있는 경우: - 특정 세션에서 긴 트랜잭션을 수행하고 있을 때, 다른 세션에서 같은 객체에 접근하려 하면 타임아웃이 발생할 수 있습니다.
- 시스템이 높은 부하 상태일 때: - 세션이 많거나 리소스가 부족하여 객체 잠금 해제가 지연될 수 있습니다.
해결 방법
ORA-04021 오류를 해결하려면 다음 방법을 시도해 보세요.
- 잠금을 유지하는 세션 확인 및 강제 종료: - `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;
- 오래 실행 중인 트랜잭션 종료: - `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;
- DDL 실행 전 객체가 사용 중인지 확인: - `DBA_OBJECTS`를 조회하여 해당 객체가 사용 중인지 먼저 확인한 후 DDL을 실행하세요.
- DBMS_LOCK.RELEASE를 사용하여 수동으로 잠금 해제: - `DBMS_LOCK` 패키지를 활용하여 불필요한 잠금을 해제할 수 있습니다.
- 타임아웃 설정 증가: - PL/SQL 코드에서 `DBMS_LOCK.SLEEP`을 사용하여 일정 시간 후 다시 시도하는 로직을 추가할 수 있습니다.
요약
- ORA-04021 오류는 다른 세션이 객체를 잠그고 있어 일정 시간 내에 잠금을 얻지 못했을 때 발생합니다.
- 해결 방법: - `V$SESSION`, `V$LOCK`을 조회하여 잠금 세션을 찾고 종료 - 오래 실행 중인 트랜잭션을 롤백 - DDL 실행 전에 객체 사용 여부 확인 - `DBMS_LOCK.RELEASE`로 강제 잠금 해제 - 타임아웃을 증가하거나 재시도 로직 추가
반응형
'SW > Database' 카테고리의 다른 글
ORA-29261: bad argument / 원인과 해결 방법 (0) | 2025.02.16 |
---|---|
ORA-01688: unable to extend table in tablespace due to free space fragmentation / 원인과 해결 방법 (0) | 2025.02.16 |
ORA-24381: Array size exceeds session limit / 원인과 해결 방법 (0) | 2025.02.16 |
ORA-06504: PL/SQL 오류 - 행 유형 불일치 / 원인과 해결 방법 (0) | 2025.02.12 |
ORA-07445: Exception Encountered: Core Dump / 원인과 해결 방법 (0) | 2025.02.12 |