<aside> 💡

251105(수) 배송 담당자 생성 시 동시성 문제에 대하여

문제 사항

배송 담당자를 생성할 때 순번이 부여되는데, create가 동시에 일어나면 같은 순번이 부여될 수 있는 문제가 발생

문제 정의 및 해결 과제

배송 담당자 생성시 순번이 부여되기 때문에, DB에서 마지막 순번을 확인한 후, 마지막 순번+1을 부여하여 담당자를 생성해여야 한다. 만약 배송 담당자 생성이 동시에 일어났을 때, 조회된 마지막 순번이 같으므로, 똑같은 순번의 번호로 insert시도가 동시에 일어나게 된다. 이때 중복 데이터가 발생하거나, 한쪽의 요청이 실패하게 되는데, 이것을 어떻게 해결해야 할까?🧐

전략

  1. DB 레벨에서 제약조건 + 재시도
  2. 비관적 락(Pessimistic Lock) — SELECT ... FOR UPDATE
  3. 별도 시퀀스 테이블 / Redis INCR

선택한 전략 및 해결 과정

Step 1. 1번 (Unique 제약조건 + 재시도)

Step 2. 1번을 선택했으나 다중스레드에서 시도시 동시성 문제를 처리하지 못하여 2번 시도

image.png

“현재 허브에 등록된 배송담당자 중 가장 큰 배송순번(delivery_order)을 찾아서 다음 순번을 만들기 전에 락을 걸고 읽겠다” 라는 의미

성공

image.png

📌 아쉬운 점

</aside>