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

동시성 문제: Lost Update와 Dirty Read

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

13강. 동시성 문제: Lost Update와 Dirty Read

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

두 경기 완료 요청이 동시에 같은 평점을 읽고 각각 새 값을 저장하면 한쪽 증가분이 사라질 수 있습니다. 세션 두 개로 Lost Update를 재현하고 PostgreSQL에서 Dirty Read가 어떻게 다뤄지는지 확인합니다.

2. 학습 목표

3. 핵심 개념

Lost Update는 두 트랜잭션이 같은 이전 값을 바탕으로 덮어써 한 변경이 사라지는 현상입니다. Dirty Read는 아직 커밋되지 않은 값을 다른 트랜잭션이 읽는 현상입니다. PostgreSQL의 READ UNCOMMITTEDREAD COMMITTED처럼 동작하므로 Dirty Read를 허용하지 않지만, 읽고 계산해 절대값으로 쓰는 코드는 여전히 손실 갱신을 만들 수 있습니다.

4. 단계별 예시

대상: PowerShell 창 A와 B, ranking.players의 player_id 42

database/sql/13-safe-rating.sql
-- 안전한 원자적 증가
UPDATE ranking.players
SET rating = rating + 25,
version = version + 1,
updated_at = now()
WHERE player_id = 42;

-- API가 읽은 version=3일 때만 변경하는 낙관적 잠금
UPDATE ranking.players
SET rating = 1125,
version = version + 1,
updated_at = now()
WHERE player_id = 42
AND version = 3
RETURNING player_id, rating, version;
PowerShell · 두 세션 열기
Start-Process powershell -ArgumentList '-NoExit', '-Command', 'psql -d game_ranking_dev'
Start-Process powershell -ArgumentList '-NoExit', '-Command', 'psql -d game_ranking_dev'

5. 동작 원리

rating = rating + 25는 PostgreSQL이 행 잠금을 획득한 뒤 최신 행 값에 연산하므로 두 증가가 직렬화됩니다. 버전 조건 방식은 다른 트랜잭션이 먼저 갱신하면 영향 행 수가 0이 되어 API가 충돌을 감지하고 재조회·재시도 또는 409 응답을 선택할 수 있습니다.

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

7. 직접 실습

8. 이해 점검 질문 3개

9. 핵심 요약

MINI QUIZ

동시성 문제: Lost Update와 Dirty Read 미니 퀴즈

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

0 / 2
  1. 문제 1“동시성 문제: Lost Update와 Dirty Read” 실습 결과를 해석하는 올바른 기준은 무엇인가요?
  2. 문제 2“동시성 문제: Lost Update와 Dirty Read”의 작업 기준으로 ‘PostgreSQL에서 Dirty Read 재현을 기대’을 진단하거나 바로잡은 선택은 무엇인가요?
LESSON STATUS

학습을 마쳤나요?

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

13강. 동시성 문제: Lost Update와 Dirty Read 미완료 상태