본문으로 건너뛰기
데이터베이스 기초집LESSON 14

격리 수준, Lock, Deadlock 기초

난이도초급 → 중급
예상 시간35분
선수지식이전 강의

14강. 격리 수준, Lock, Deadlock 기초

1. 이번 강의에서 해결할 문제

격리 수준을 무조건 높이거나 여러 플레이어를 서로 다른 순서로 잠그면 대기 증가와 deadlock이 발생합니다. 필요한 일관성에 맞는 격리 수준과 일관된 잠금 순서를 선택합니다.

2. 학습 목표

3. 핵심 개념

PostgreSQL 기본 격리 수준은 Read Committed이며 각 문장은 시작 시점의 커밋된 스냅샷을 봅니다. Repeatable Read는 트랜잭션 동안 안정된 스냅샷을 제공하고 Serializable은 직렬 실행과 같은 결과를 목표로 하며 직렬화 실패 시 재시도가 필요합니다. 행 잠금은 충돌하는 변경을 기다리게 하고, 교착 상태는 서로 가진 잠금을 기다리는 순환입니다.

4. 단계별 예시

파일 경로: C:\dev\game-ranking-service\database\sql\14-lock-order.sql

database/sql/14-lock-order.sql
BEGIN TRANSACTION ISOLATION LEVEL READ COMMITTED;

-- 여러 플레이어는 항상 ID 오름차순으로 잠근다.
SELECT player_id, rating
FROM ranking.players
WHERE player_id IN (42, 77)
ORDER BY player_id
FOR UPDATE;

UPDATE ranking.players
SET rating = rating + CASE player_id WHEN 42 THEN 25 ELSE -25 END,
version = version + 1,
updated_at = now()
WHERE player_id IN (42, 77);

COMMIT;
PowerShell · 잠금 관찰
psql -d game_ranking_dev -c "SELECT pid, wait_event_type, wait_event, state FROM pg_stat_activity WHERE datname = current_database();"

5. 동작 원리

FOR UPDATE는 선택한 행을 다른 갱신과 충돌하는 방식으로 잠급니다. 모든 코드 경로가 작은 ID부터 잠그면 순환 대기 가능성이 줄어듭니다. PostgreSQL은 교착을 감지하면 한 트랜잭션을 중단하므로 애플리케이션은 전체 트랜잭션을 제한 횟수와 지연을 두고 재시도해야 합니다.

6. 자주 하는 실수와 해결법

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

격리 수준, Lock, Deadlock 기초 미니 퀴즈

선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.

0 / 2
  1. 문제 1“격리 수준, Lock, Deadlock 기초” 작업 전 검토에서 채택해야 할 안전 기준은 무엇인가요?
  2. 문제 2“격리 수준, Lock, Deadlock 기초”의 작업 기준으로 ‘Serializable이면 오류가 없다고 생각’을 진단하거나 바로잡은 선택은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.

14강. 격리 수준, Lock, Deadlock 기초 미완료 상태