SQL & 데이터베이스/데이터 무결성 & 트랜잭션

ORA-00060: Deadlock Detected 오류 해결 방법

Jinsapp 2025. 3. 24. 21:48

[SQL] ORA-00060: Deadlock Detected 오류 해결 방법

1. ORA-00060 오류란?

ORA-00060 오류는 두 개 이상의 트랜잭션이 서로의 자원을 점유한 상태에서,

각자 상대방의 자원이 해제되기를 기다리면서 무한 대기 상태에 빠질 때 발생합니다.

이를 데드락(Deadlock)이라고 합니다.

2. 데드락이 발생하는 상황

서로 다른 세션이 같은 테이블을 동시에 업데이트하거나,

순서가 다른 트랜잭션 간에 서로 락을 걸면서 발생합니다.


-- Session A
BEGIN;
UPDATE employees SET salary = salary + 100 WHERE id = 1;

-- 동시에 Session B에서 실행
BEGIN;
UPDATE employees SET salary = salary + 200 WHERE id = 2;

-- Session A에서 다음 실행
UPDATE employees SET salary = salary + 100 WHERE id = 2;

-- Session B에서 다음 실행
UPDATE employees SET salary = salary + 200 WHERE id = 1;

 

이런 경우 두 세션은 서로의 락이 해제되기를 기다리며 교착 상태에 빠지고,

결국 Oracle은 둘 중 하나를 중단시키며 ORA-00060 오류가 발생합니다.

3. Oracle에서 출력되는 에러 메시지 예시


ORA-00060: deadlock detected while waiting for resource

4. 해결 방법

  • 트랜잭션 처리 순서를 일관되게 유지한다
  • 가능한 한 락을 오래 보유하지 않는다
  • 락이 많이 걸리는 작업은 트랜잭션의 마지막에 배치한다
  • 필요 없는 SELECT FOR UPDATE나 불필요한 UPDATE를 줄인다
  • 서버 로그나 트레이스를 분석해 자주 발생하는 데드락 패턴을 찾아낸다

5. 데드락 방지 전략

데드락은 주로 락을 거는 순서가 불일치할 때 발생합니다. 따라서 아래와 같은 방식으로 예방할 수 있습니다.

  • 모든 트랜잭션에서 자원을 항상 동일한 순서로 접근
  • 가능한 빨리 COMMIT 또는 ROLLBACK 수행
  • SELECT ... FOR UPDATE 구문 남발 금지
  • 문제 발생 시 v$session, v$lock 뷰를 이용해 추적

6. 관련 쿼리 예시: 현재 락 걸린 세션 확인


SELECT
    s.sid,
    s.serial#,
    l.type,
    l.lmode,
    l.request,
    l.block
FROM
    v$session s,
    v$lock l
WHERE
    s.sid = l.sid;

 

이 쿼리를 통해 어떤 세션이 어떤 자원을 점유하고 있고,

어디서 충돌이 나는지를 추적할 수 있습니다.

7. 정리

  • ORA-00060은 트랜잭션 간 락 충돌로 인한 데드락 상태에서 발생한다
  • 락 순서를 일관되게 유지하고, 빠르게 트랜잭션을 종료하는 습관이 필요하다
  • 발생 원인을 파악하고 구조적인 개선이 필요하다

🔗 다른 트랜잭션 오류 해결 글도 함께 확인해보세요!

SQL 트랜잭션 기본 개념과 오라클 예제