TIL

원자적 쓰기로 동시성·멱등 제어

1. 원자적 조건부 UPDATE

UPDATE stock SET qty = qty - 1 WHERE id = ? AND qty >= 1;

2. UNIQUE 제약 = race·중복 최종 방어선

3. Upsert / insert-or-ignore

PostgreSQL — ON CONFLICT (9.5+)

-- insert-or-ignore (멱등): 이미 있으면 건너뜀
INSERT INTO processed(idem_key) VALUES (?) ON CONFLICT (idem_key) DO NOTHING;

-- upsert: 있으면 갱신
INSERT INTO stock(id, qty) VALUES (?, ?) ON CONFLICT (id) DO UPDATE SET qty = EXCLUDED.qty;

-- 누적 upsert
INSERT INTO counter(key, n) VALUES (?, 1)
ON CONFLICT (key) DO UPDATE SET n = counter.n + EXCLUDED.n;

MySQL

MERGE (PostgreSQL 15+)

동시성

4갈래 비교

갈래 기법 특징 노트
비관적 락 FOR UPDATE / SKIP LOCKED 잠그고 진행, 직렬화 안전 locking-reads
낙관적 락 @Version + 재시도 충돌 시 재시도, 고경합 retry storm (예정)
원자적 쓰기 조건부 UPDATE · UNIQUE · upsert 단일 문장 원자성, 락 최소 (이 노트)
범위 제약 exclusion constraint 구간 겹침 선언적 금지(PG) exclusion-constraint

참고