ORA-00060 : deadlock detected while waiting for resource

에러 코드 : ORA-00060
에러 메시지: "deadlock detected while waiting for resource" (자원을 기다리는 동안 교착 상태 감지됨)

 

상황 설명

데이터베이스에서 ORA-00060 오류는 두 개 이상의 사용자 세션이 서로의 자원을 필요로 할 때 교착 상태에 빠져 발생합니다. 각 세션은 다른 세션이 소유한 자원의 잠금을 요청하며, 이로 인해 두 세션이 모두 진행할 수 없는 상태에 빠집니다.


예제

이 예제에서는 두 사용자 세션이 각각 다른 순서로 두 개의 테이블에 접근하려고 하며, 이로 인해 교착 상태가 발생합니다.

세션 1:
  시간 T1: tableA의 id=1 레코드를 업데이트합니다.
  시간 T3: tableB의 id=1 레코드를 업데이트하려고 시도합니다.


세션 2:
  시간 T2: tableB의 id=1 레코드를 업데이트합니다.
  시간 T4: tableA의 id=1 레코드를 업데이트하려고 시도합니다.
이 시나리오에서는 다음과 같이 교착 상태가 발생합니다:

세션 1은 tableB의 id=1 레코드에 대한 잠금을 기다립니다 (이미 세션 2에 의해 잠금).
세션 2는 tableA의 id=1 레코드에 대한 잠금을 기다립니다 (이미 세션 1에 의해 잠금).


해결 방법

트랜잭션 순서 표준화: 모든 트랜잭션이 동일한 순서, 예를 들어 먼저 tableA를 처리하고 그 다음 tableB를 처리하도록 구조를 조정합니다.
타임아웃 설정: 각 트랜잭션에 타임아웃을 설정하여, 일정 시간 내에 완료되지 않으면 자동으로 롤백되도록 합니다.
자원 잠금 최소화: 필요한 자원에만 잠금을 걸어 다른 트랜잭션이 대기하는 시간을 최소화합니다.


요약

ORA-00060: deadlock detected while waiting for resource 오류는 트랜잭션이 다른 트랜잭션에 의해 사용 중인 자원을 필요로 할 때 발생하는 교착 상태로 인해 발생합니다. 이를 해결하기 위해서는 트랜잭션의 실행 순서를 표준화하고, 타임아웃 설정을 활용하는 것이 효과적입니다.

'ORACLE > ERROR CODE' 카테고리의 다른 글

ORA-00002: fetch out of sequence  (0) 2024.04.24
ORA-01017: invalid username/password  (0) 2024.04.23
ORA-00933 : SQL command not properly ended  (0) 2024.04.20
ORA-12899 : value too large for column  (0) 2024.04.20
ORA-01843: not a valid month  (0) 2024.04.19