본문 바로가기
database/oracle

🌳 17편. Lock 이해와 Deadlock 방지 전략

by 죄니안죄니 2025. 5. 7.

🌳 17편. Lock 이해와 Deadlock 방지 전략

데이터베이스는 동시성 처리를 위해 여러 사용자의 트랜잭션을 병렬로 처리합니다.
이 과정에서 데이터 충돌을 방지하기 위해 Lock(잠금)이 필요하며, 잘못된 처리 순서나 구조는 Deadlock(교착 상태)을 유발할 수 있습니다.
이번 글에서는 Lock의 종류, 발생 원리, 확인 방법, Deadlock 회피 전략을 정리합니다.


🔐 1. Lock의 개념

  • 공유 락 (Share Lock, S): 다른 사용자도 읽기 가능 (읽기 전용)
  • 배타 락 (Exclusive Lock, X): 해당 행/테이블을 독점 (쓰기 작업)

💡 예: UPDATE 시 배타락 발생


-- 세션 1
BEGIN
  UPDATE EMP SET SAL = SAL + 100 WHERE EMPNO = 7369;
  -- COMMIT 또는 ROLLBACK 전까지 잠금 유지
END;

-- 세션 2
SELECT * FROM EMP WHERE EMPNO = 7369; -- 대기 상태 발생

🔁 2. Deadlock이란?

두 개 이상의 트랜잭션이 서로의 자원을 서로 잠근 상태로 대기할 때 발생합니다.
→ 시스템이 자동으로 한 트랜잭션을 강제로 종료하여 Deadlock을 해제합니다.

❗ 예시 시나리오


-- 세션 1
UPDATE EMP SET SAL = SAL + 100 WHERE EMPNO = 100; -- 락1
-- 다음 명령어 실행 전 세션 2가 개입

-- 세션 2
UPDATE EMP SET SAL = SAL + 200 WHERE EMPNO = 200; -- 락2
-- 다시 세션 1로 돌아가서
UPDATE EMP SET SAL = SAL + 100 WHERE EMPNO = 200; -- 대기
-- 세션 2도 100에 대해 UPDATE 시도 → Deadlock 발생

📌 3. 락 정보 조회 방법


-- 현재 세션의 락 정보
SELECT * FROM V$LOCK WHERE BLOCK = 1;

-- 락 대기 상태 확인
SELECT SID, TYPE, ID1, ID2, LMODE, REQUEST, BLOCK
FROM V$LOCK
WHERE REQUEST > 0;

-- 세션 정보 확인
SELECT SID, SERIAL#, STATUS, PROGRAM FROM V$SESSION;

🛠 4. 락 해제 및 세션 종료


-- 강제 세션 종료
ALTER SYSTEM KILL SESSION 'SID,SERIAL#';

주의: 운영 환경에서는 반드시 DBA 승인 후 수행


🚧 5. Deadlock 방지 전략

  • 항상 일관된 테이블/행 접근 순서 사용
  • SELECT FOR UPDATE NOWAIT로 선제적 확인
  • 가능하면 트랜잭션 범위 최소화
  • 단일 UPDATE 대신 MERGE + 조건 분기 활용 고려

✅ SELECT FOR UPDATE 예시


SELECT * FROM EMP
WHERE EMPNO = 7369
FOR UPDATE NOWAIT;

→ 이미 락이 걸려 있으면 즉시 오류 발생 (대기하지 않음)


📎 6. 실무에서의 진단 예시

  • ORA-00060: deadlock detected 에러 → Alert Log에서 추적 가능
  • DBMS_MONITOR 또는 트레이스 레벨 로그로 상세 분석 가능

📝 마무리

이번 글에서는 Oracle의 Lock 구조와 Deadlock의 원리, 그리고 실무에서 적용 가능한 예방 및 진단 전략을 정리했습니다.
다음 글에서는 Connection Pool과 세션 관리를 통해 DB 연결을 효율적으로 관리하는 방법을 소개합니다.

댓글