ONE QUESTION AT A TIME.

천천히 생각하고, 분명하게.

TODAY’S QUESTION391 / 1500
데이터베이스난이도 중하5분 답변 목표 · 보강본

여러 워커가 DB 작업 테이블을 읽을 때 SKIP LOCKED로 나누면 중복 실행과 기아도 해결되나요?

잠깐, 답변을 보기 전에
먼저 내 말로 설명해 볼까요?

답변과 점검 포인트 펼치기답변 접기
01

구두 답변

정의를 외우기보다, 원리와 조건을 연결해 설명해 보세요.

SKIP LOCKED는 다른 트랜잭션이 잠근 행을 기다리지 않고 건너뛰게 합니다. 워커 간 즉시 경합을 줄이지만 정확히 한 번 실행이나 공정한 순서를 보장하는 기능은 아닙니다.

동작 원리와 전제

짧은 트랜잭션에서 대기 작업을 잠그고 running 상태·소유자·lease를 기록한 뒤 커밋하고 실제 작업을 실행할 수 있습니다. 외부 호출 내내 행 잠금을 잡으면 연결·락이 오래 점유됩니다. 반대로 상태 기록 없이 잠금만 풀면 다른 워커가 같은 작업을 가져갑니다.

선택과 실패 처리

워커가 죽으면 만료된 작업을 재획득할 정책이 필요합니다. lease 만료 뒤 옛 워커가 살아 있을 수 있으므로 외부 효과의 멱등 키와 완료 갱신의 세대 조건을 둡니다. 계속 잠기는 행은 뒤로 밀릴 수 있어 가장 오래된 작업과 재시도 횟수를 관찰합니다.

구체적인 사례와 검증

워커 A가 작업 1을 오래 잠그고 B가 작업 2·3을 처리하면 큐의 등록 순서와 완료 순서가 달라집니다. 결제 상태처럼 앞 작업의 효과가 후속 작업의 전제라면 이 구조를 그대로 적용할 수 없습니다. 독립 작업 큐에 사용하거나 계정별 선행 상태를 따로 검사해야 합니다. 획득 transaction이 짧아진 뒤에는 실행권을 row lock 대신 내구 상태로 표현해야 합니다. 완료 UPDATE에 작업 ID·owner·generation을 함께 넣어 새 owner의 상태를 옛 워커가 덮지 못하게 합니다. 실패 작업의 backoff와 최대 대기 나이를 기록하면 항상 뒤로 밀리는 행을 찾을 수 있습니다. 처리 기록을 먼저 완료로 표시한 뒤 외부 작업을 시작하지 않습니다.

처리 순서를 ORDER BY로 표현해도 잠긴 행을 건너뛴 결과는 엄격한 FIFO가 아닙니다. 빈 조회가 전체 큐가 비었다는 뜻인지 잠긴 작업만 남았다는 뜻인지 구분합니다. 획득·외부 성공·완료 기록 전후의 중단을 시험해 중복·유실·유령 작업을 검증하겠습니다.

02

득점 포인트

이해가 드러나는 지점을 확인해 보세요.

  • 핵심 구분: SKIP LOCKED는 다른 트랜잭션이 잠근 행을 기다리지 않고 건너뛰게 합니다.
  • 선택 조건: 워커가 죽으면 만료된 작업을 재획득할 정책이 필요합니다.
  • 검증 기준: 처리 순서를 ORDER BY로 표현해도 잠긴 행을 건너뛴 결과는 엄격한 FIFO가 아닙니다.
03

감점 포인트

놓치기 쉬운 조건과 오해를 짚어 보세요.

  • SKIP LOCKED가 FIFO와 exactly-once 실행을 보장한다고 한다.
04

더 파고들 거리

하나 더 질문하며 이해의 범위를 넓혀 보세요.

  • 읽은 행을 바탕으로 쓰기 전에 다른 변경을 막으려면 잠금 범위와 transaction 경계를 어떻게 정하나요?
  • 옛 작업자가 소유권 만료 뒤 깨어나면 실제 저장 지점에서 어떤 세대로 쓰기를 거절하나요?
  • 처리 성공 뒤 ACK가 유실돼 다시 받은 이벤트를 원장에 한 번만 반영하려면 어떻게 하나요?

득점·감점 포인트는 학습용 자기 점검 기준이며, 특정 회사의 실제 채점표가 아닙니다.

원리부터 공부하고 싶다면

답변을 보충하는 개념·예제·슈도코드를 읽어 보세요.

← 전체 질문 보기