본문 바로가기
Database/Oracle

[ORACLE] ORA-00060 오류 완전 분석 : 데드락 감지와 회피 전략

by Papa Martino V 2025. 7. 28.
728x90

ORA-00060 오류 완전 분석 : 데드락 감지와 회피 전략
[ORACLE] ORA-00060

 

ORA-00060: deadlock detected while waiting for resource

Oracle 데이터베이스에서 ORA-00060 오류는 다수의 트랜잭션이 서로의 자원을 대기하다가 교착 상태(Deadlock)에 빠졌을 때 발생합니다. 일반적인 락 대기와 달리 데드락은 시스템이 스스로 해결할 수 없는 순환 대기 구조로, Oracle은 이 상태를 감지하면 내부적으로 한 트랜잭션을 강제로 종료하고 오류를 발생시킵니다. 본 글에서는 ORA-00060 오류의 발생 구조, 실무에서 자주 발생하는 상황, 그리고 이를 감지하고 회피하는 실용적인 전략을 제시합니다.


1. ORA-00060 오류란?

이 오류는 서로 다른 트랜잭션이 상대방이 보유한 리소스를 동시에 요청하며 발생합니다. 예를 들어:

  1. Session A가 테이블 X의 행을 잠금
  2. Session B가 테이블 Y의 행을 잠금
  3. 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

원인 분석:

  • 업데이트 순서가 서로 달라 서로의 세션이 자원을 점유한 상태에서 교착 발생
  • 인덱스를 통한 행 접근이 불규칙하게 일어나면서 발생 확률 증가

조치 사항:

  1. 동시 작업 순서 통일 (ORDER BY 절 기준 정렬 삽입)
  2. 트랜잭션 단위 최소화
  3. 락 해제를 위한 커밋 타이밍 조절

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
728x90