
ORA-00060: deadlock detected while waiting for resource
Oracle 데이터베이스에서 ORA-00060 오류는 다수의 트랜잭션이 서로의 자원을 대기하다가 교착 상태(Deadlock)에 빠졌을 때 발생합니다. 일반적인 락 대기와 달리 데드락은 시스템이 스스로 해결할 수 없는 순환 대기 구조로, Oracle은 이 상태를 감지하면 내부적으로 한 트랜잭션을 강제로 종료하고 오류를 발생시킵니다. 본 글에서는 ORA-00060 오류의 발생 구조, 실무에서 자주 발생하는 상황, 그리고 이를 감지하고 회피하는 실용적인 전략을 제시합니다.
1. ORA-00060 오류란?
이 오류는 서로 다른 트랜잭션이 상대방이 보유한 리소스를 동시에 요청하며 발생합니다. 예를 들어:
- Session A가 테이블 X의 행을 잠금
- Session B가 테이블 Y의 행을 잠금
- Session A가 Y를 잠그려 하고, 동시에 B가 X를 잠그려 함
이 구조는 교차 대기 상태로, 두 세션은 영원히 상대방의 자원을 기다리게 됩니다. Oracle은 일정 시간 대기 후, 자동으로 하나의 세션을 종료하며 아래 오류를 발생시킵니다.
ORA-00060: deadlock detected while waiting for resource
2. 데드락 vs 락 대기 비교
| 구분 | 데드락 (ORA-00060) | 일반 락 대기 |
|---|---|---|
| 정의 | 상호 간 자원을 대기하여 순환 구조 형성 | 단일 자원 대기로 일방적인 대기 상태 |
| 해결 방식 | Oracle이 자동으로 한 트랜잭션 강제 종료 | 락 해제 시 자동으로 대기 해소 |
| 발생 빈도 | 낮음 (설계 오류에서 주로 발생) | 일반적인 트랜잭션 경쟁에서 빈번 |
| 진단 난이도 | 중간~상 (트랜잭션 순서 및 SQL 추적 필요) | 낮음 (락 점유자만 확인하면 됨) |
3. 실무 사례: ERP 인사 모듈 급여 테이블 동시 접근
문제 배경: HR 부서에서 급여 데이터 일괄 수정 중, 자동 배치 스크립트가 동시에 급여 테이블을 UPDATE함. 결과적으로 다수의 데드락 발생.
오류 로그:
ORA-00060: deadlock detected while waiting for resource
원인 분석:
- 업데이트 순서가 서로 달라 서로의 세션이 자원을 점유한 상태에서 교착 발생
- 인덱스를 통한 행 접근이 불규칙하게 일어나면서 발생 확률 증가
조치 사항:
- 동시 작업 순서 통일 (ORDER BY 절 기준 정렬 삽입)
- 트랜잭션 단위 최소화
- 락 해제를 위한 커밋 타이밍 조절
4. 데드락 감지 방법
Alert 로그 확인 (Oracle 자체 감지)
$ORACLE_BASE/diag/rdbms/<DB_NAME>/trace/alert_<SID>.log
v$session, v$lock 활용
SELECT s.sid, s.serial#, s.username, s.osuser, l.type, l.lmode, l.request
FROM v$session s
JOIN v$lock l ON s.sid = l.sid
WHERE l.request > 0;
데드락 트레이스 파일 추적
-- alert 로그에 "DEADLOCK DETECTED" 문구 확인 후 해당 트레이스 확인
$ORACLE_BASE/diag/rdbms/<db>/trace/ora_XXXXX.trc
5. 해결 전략 요약
| 전략 | 내용 | 적용 팁 |
|---|---|---|
| 작업 순서 일관화 | 동일 테이블 접근 시 동일한 행 순서 사용 | ORDER BY PK 적용 권장 |
| 트랜잭션 간소화 | UPDATE 범위 최소화 | 트랜잭션 분할 수행 |
| 락 보유 시간 단축 | 작업 후 즉시 COMMIT | 지연 커밋 지양 |
| 락 분석 도구 활용 | Statspack, AWR 등 활용 | 정기적인 모니터링 |
6. 고급 대응 팁
트랜잭션 강제 종료
ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE;
DBMS_LOCK 패키지 사용
-- 사용자 정의 잠금 제어
DBMS_LOCK.SLEEP(10);
APM 연동으로 원인 추적
- New Relic, AppDynamics, Pinpoint 등으로 SQL 추적 가능
7. 예방을 위한 시스템 설계 권장사항
- 모든 테이블에 PK 지정: 인덱스를 통해 락 범위 최소화
- 애플리케이션 트랜잭션 설계 시 주의: 동일 순서로 자원 요청
- 대량 작업은 배치 시간 분리: 동시성 최소화
- 락 발생 구간 로깅: 문제가 반복되면 SQL 로그 확보
8. 결론
ORA-00060 오류는 단순한 락 충돌을 넘어 시스템 전체의 트랜잭션 구조에 영향을 줄 수 있는 중요한 신호입니다. 반복적인 데드락은 성능 저하와 사용자 불만을 야기할 수 있으며, 이를 감지하고 예방하는 전략은 안정적인 시스템 운영의 핵심 요소입니다. 이 글을 통해 데드락의 작동 원리를 이해하고, 실무 중심의 진단 및 회피 전략을 숙지함으로써 보다 효율적이고 안정적인 DB 트랜잭션 설계를 할 수 있기를 바랍니다.
출처
- Oracle® Database Error Messages 19c
- Oracle Database Performance Tuning Guide
'Database > Oracle' 카테고리의 다른 글
| [ORACLE] ORA-00404 오류 분석과 해결 : 초기화 파라미터 관련 문제의 본질 (0) | 2025.07.28 |
|---|---|
| [ORACLE] ORA-00054 오류 완전 정복 : 리소스 잠금으로 인한 DDL 실패의 근본 원인과 실무 대응 전략 (0) | 2025.07.28 |
| [ORACLE] ORA-02292 오류 완전 정복 : 자식 테이블 참조로 인한 삭제 실패의 모든 것 (0) | 2025.07.28 |
| [ORACLE] ORA-00020 오류 해결 가이드 : 세션 수 초과의 원인과 진단 전략 (0) | 2025.07.28 |
| [ORACLE] ORA-28040 오류 해결 : 프로토콜 불일치로 인한 인증 실패의 원인과 대책 (0) | 2025.07.28 |