ORA-00060: Deadlock detected while waiting for resource
Oracle의미
둘 이상의 세션이 서로가 보유한 리소스를 기다리며 데드락 상태에 빠졌다. Oracle은 순환을 감지해 희생자를 선택하고 해당 세션의 문장을 롤백한다.
원인
서로 다른 순서로 획득한 행 락, 서로 다른 트랜잭션이 같은 행을 교차로 갱신, 인덱스 없는 외래 키로 인해 부모 테이블 갱신 시 걸리는 테이블 락, 또는 bitmap 인덱스에 대한 동시 DML.
해결 방법
alert log에 기록된 데드락 트레이스(graph) 파일을 검토해 충돌하는 SQL 문과 행을 찾는다. 애플리케이션에서는 항상 같은 순서로 테이블/행에 접근한다. 외래 키 컬럼에 인덱스를 생성한다(인덱스 없는 FK는 대표적인 데드락 원인이다). 트랜잭션을 짧게 유지하고 커밋 빈도를 검토한다. 데드락이 발생한 트랜잭션은 애플리케이션에서 잡아 재시도한다.
같은 데이터베이스의 다른 항목
- ORA-00001Unique constraint violated
- ORA-00054Resource busy and acquire with NOWAIT specified or timeout expired
- ORA-01017Invalid username/password; logon denied
- ORA-01555Snapshot too old: rollback segment number too small
- ORA-01652Unable to extend temp segment by N in tablespace
- ORA-04031Unable to allocate N bytes of shared memory