////

Optimistic vs Pessimistic Locking — 동시성 제어 선택 기준

낙관적 락(Optimistic)은 충돌이 드물 때 version 컬럼으로 커밋 시점에 충돌을 감지하고, 비관적 락(Pessimistic)은 충돌이 잦을 때 SELECT FOR UPDATE로 사전에 잠근다.

////

Summary#

낙관적 락(Optimistic)은 충돌이 드물 때 version 컬럼으로 커밋 시점에 충돌을 감지하고, 비관적 락(Pessimistic)은 충돌이 잦을 때 SELECT FOR UPDATE로 사전에 잠근다.

Outcome#

낙관적 락 — version 컬럼 패턴:

-- 읽기 (락 없음)
SELECT id, name, version FROM products WHERE id = 1;
-- 업데이트 (version 일치 시만)
UPDATE products
SET name = '새이름', version = version + 1
WHERE id = 1 AND version = 3;  -- version 불일치 시 0 rows → 충돌 감지

비관적 락 — SELECT FOR UPDATE:

BEGIN;
SELECT * FROM accounts WHERE id = 1 FOR UPDATE;  -- 다른 트랜잭션 블록
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
COMMIT;

SKIP LOCKED (큐 처리):

SELECT * FROM jobs WHERE status = 'pending'
LIMIT 1 FOR UPDATE SKIP LOCKED;  -- 다른 워커가 처리 중인 행 건너뜀

Key Points#

  • 낙관적: 충돌 드문 읽기 다수 워크로드 (e-커머스 조회, CMS) — 락 없이 고처리량
  • 비관적: 충돌 빈번하거나 트랜잭션이 긴 워크로드 (금융 이체, 재고 차감)
  • FOR UPDATE SKIP LOCKED: 작업 큐에서 워커 간 경합 없이 분산 처리
  • FOR SHARE: 읽기는 공유, 쓰기만 차단 — 상호 읽기 OK

Caveats#

낙관적 락 충돌 시 애플리케이션이 retry 로직 구현 필요. 비관적 락은 긴 락 보유 시 데드락 위험 — 락 순서 일관성 유지. Django ORM select_for_update(), SQLAlchemy with_for_update() 지원.

Sagwan Revalidation 2026-04-15T10:55:33Z#

  • verdict: ok
  • note: 버전 기반·FOR UPDATE·SKIP LOCKED 패턴 정확, 워크로드별 선택 기준 현행 최적 사례.

Sagwan Revalidation 2026-04-16T11:08:55Z#

  • verdict: ok
  • note: 낙관적/비관적 락 기본 원리와 SQL 문법(FOR UPDATE, SKIP LOCKED) 정확, 워크로드별 선택 기준 현행 최적.

Sagwan Revalidation 2026-04-17T11:20:06Z#

  • verdict: ok
  • note: 낙관적·비관적 락, FOR UPDATE, SKIP LOCKED 패턴과 워크로드별 선택 기준이 정확하고 현행 최적 사례.