데이터베이스 기초집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 UNCOMMITTED는 READ 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
0 / 2동시성 문제: Lost Update와 Dirty Read 미니 퀴즈
선택 즉시 정답과 해설을 확인할 수 있습니다. 결과는 이 브라우저에만 저장됩니다.
LESSON STATUS
13강. 동시성 문제: Lost Update와 Dirty Read 미완료 상태학습을 마쳤나요?
직접 실습과 점검 질문까지 확인한 뒤 완료로 표시하세요.