TIL

Locking Reads (FOR UPDATE / SKIP LOCKED)

Locking Read 종류

SELECT … FOR SHARE

SELECT … FOR UPDATE

SELECT * FROM account WHERE id = 1 FOR UPDATE;  -- 이 행을 잠그고 최신값 읽기

Consistent Read vs Current Read

NOWAIT / SKIP LOCKED

NOWAIT

SKIP LOCKED

SELECT id FROM jobs
WHERE status = 'ready'
ORDER BY id
LIMIT 10
FOR UPDATE SKIP LOCKED;   -- 안 잠긴 작업 10개만 원자적으로 선점

잠금 범위와 갭 락 (InnoDB)

SKIP LOCKED로 작업 큐 (DB-as-queue)

MySQL vs PostgreSQL

구분 MySQL (InnoDB) PostgreSQL
기본 격리수준 REPEATABLE READ READ COMMITTED
갭·next-key 락 있음 (RR에서 phantom 방지) 없음 (직렬화는 SERIALIZABLE의 SSI predicate lock)
locking read 충돌 시 current read로 최신 읽고 블록(대기) RR/SERIALIZABLE이면 직렬화 에러→재시도, RC면 대기 후 최신 재평가
MVCC 저장 undo log로 이전 버전 재구성 heap에 다중 버전 보관(+ VACUUM 정리)
행 잠금 모드 FOR UPDATE / FOR SHARE (2종) FOR UPDATE / FOR NO KEY UPDATE / FOR SHARE / FOR KEY SHARE (4종)
SKIP LOCKED / NOWAIT 8.0+ 9.5+

참고