🌳 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 연결을 효율적으로 관리하는 방법을 소개합니다.
'database > oracle' 카테고리의 다른 글
🌳 19편. 실행계획(EXPLAIN PLAN)으로 튜닝하기 (0) | 2025.05.07 |
---|---|
🌳 18편. Connection Pool과 세션 관리 (1) | 2025.05.07 |
🌳 16편. 트랜잭션과 격리 수준 완전 정리 (0) | 2025.05.07 |
🌳 15편. PARTITION 테이블과 대용량 테이블 설계 전략 (0) | 2025.05.06 |
🌳 14편. 실무 고급 SQL 패턴 모음 (0) | 2025.05.06 |
댓글