본문으로 건너뛰기
데이터베이스 기초집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 기초 미완료 상태