동시성 — 두 사람이 같은 행을 건드릴 때 · 잠금과 데드락 · 실습
두 세션으로 부딪혀 본다
목표
혼자 돌릴 때는 맞는데 둘이 동시에 하면 틀리는 코드를 직접 만들고 고칩니다.
동시성 문제는 재현이 어려워서 어렵습니다. 그래서 이 실습은 전부 **세션 두 개를
실제로 띄워** 부딪히게 합니다.
환경
PostgreSQL 16 이 이미 떠 있습니다(5432, DB labdb, 사용자 lab).
export PATH=/usr/lib/postgresql/16/bin:$PATHpsql -h 127.0.0.1 -U lab -d labdb두 세션 만드는 법
한쪽을 백그라운드로 띄우고 그동안 다른 쪽을 칩니다.
psql -h 127.0.0.1 -U lab -d labdb -c "begin; select * from stock where id=1 for update; select pg_sleep(15);" &sleep 1# 여기서 두 번째 세션 작업wait준비
create table stock(id int primary key, qty int not null);insert into stock values (1,10),(2,10);단계
1. 잠금 대기 만들기 → 01-block.txt
2. lock_timeout → 02-timeout.txt
3. 데드락 일부러 내기 → 03-deadlock.txt
4. 순서를 맞춰 없애기 → 04-order.txt
5. 동시 20회 차감에도 음수 없이 → 05-stock.txt
6. skip locked 로 워커 큐 → 06-queue.txt
7. 어드바이저리 잠금 → 07-advisory.txt
8. 정리 → 08-notes.md
참고
3단계는 실패가 정답입니다. deadlock detected 의 DETAIL 두 줄이
누가 무엇을 기다렸는지 정확히 알려 줍니다 — 그 두 줄을 읽는 법이
이 실습에서 가장 오래 쓰이는 기술입니다.
단계 8개
- 잠금 대기를 만든다
- 무한히 기다리지 않게 한다
- 데드락을 일부러 만든다
- 순서를 맞춰 없앤다
- 재고가 음수가 되지 않게
- 워커가 줄 서지 않게
- 행이 없는 것에 잠금을 건다
- 세 가지를 정리한다