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은 트랜잭션 간 락 충돌로 인한 데드락 상태에서 발생한다
- 락 순서를 일관되게 유지하고, 빠르게 트랜잭션을 종료하는 습관이 필요하다
- 발생 원인을 파악하고 구조적인 개선이 필요하다
🔗 다른 트랜잭션 오류 해결 글도 함께 확인해보세요!