LabHub

동시성 — 두 사람이 같은 행을 건드릴 때 · 잠금과 데드락 · 실습

두 세션으로 부딪혀 본다

LabHub 에서 이어서 보기

목표

혼자 돌릴 때는 맞는데 둘이 동시에 하면 틀리는 코드를 직접 만들고 고칩니다.
동시성 문제는 재현이 어려워서 어렵습니다. 그래서 이 실습은 전부 **세션 두 개를
실제로 띄워** 부딪히게 합니다.

환경

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_timeout02-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개

  1. 잠금 대기를 만든다
  2. 무한히 기다리지 않게 한다
  3. 데드락을 일부러 만든다
  4. 순서를 맞춰 없앤다
  5. 재고가 음수가 되지 않게
  6. 워커가 줄 서지 않게
  7. 행이 없는 것에 잠금을 건다
  8. 세 가지를 정리한다