상품 재고 관리 - 비관적 락 vs 분산 락 적용 사례

2025. 1. 31. 02:30·이슈
목차
  1.  
  2. 재고 차감 동시성 문제
  3.  
  4. 문제 상황
  5. 해결 방안 고민
  6. 재고 롤백 스케줄러  분산락 적용
  7. 문제 상황
  8. 해결방안
  9. ❓비관적 락 적용 안한 이유

 

재고 차감 동시성 문제

 

문제 상황

🚨 주문-상품 서비스간 2PC 방식 구현 중 동일 상품에 대한 동시 주문 발생 시 재고 수량 데이터 불일치 문제 발견

 

 

JMeter 테스트 상품 재고 100개, 200번의 동시 요청

  • 테스트 요청 수 - 200건
  • 성공 응답 수 - 200건
  • 오류율 - 0%
  • 평균 처리 시간 - 167.8/sec

 

 

모든 요청을 성공으로 응답했으나 데이터베이스의 실제 데이터와 불일치가 발생

  • 재고 차감 이력 테이블 : 200건 기록
  • 실제 상품 재고: 79개 (21개 차감)

 

해결 방안 고민

❓분산락 적용 안한 이유

  1. 분산락은 전체 프로세스에 락을 걸어 동시성을 제어
  2. 상품 재고 차감은 DB에 단일 리소스 업데이트 하는 과정으로 전체 프로세스에 락을 걸 필요X
  3. 여러 DB서버가 존재하는게 아니고 현재 단일 DB서버 사용중
  4. 지금 같은 상황에서 분산락을 적용한다면 오버스팩이라고 생각

❓낙관적 락 적용 안한 이유

  1. 롤백 재시도 로직 구현하기 번거롭고 작성한 로직에서 추가적인 문제 발생할 수 있다
  2. 인기상품 구매로 동시요청이 많아질 경우 계속 충돌 발생하면서 부하발생

비관적락 적용

 

 

JMeter 테스트 상품 재고 100개, 200번의 동시 요청

  • 테스트 요청 수 - 200건
  • 성공 응답 수 - 100건
  • 오류율 - 50%
  • 평균 처리 시간 - 143.9/sec

 

 

요청 결과와 데이터베이스의 정합성 보장

  • 재고 차감 이력 테이블 - 100건 기록
  • 실제 상품 재고 - 0개 (초기 100개에서 모두 차감)
  • 실패한 요청 - 100건 (재고 부족으로 인한 에러)

 

 




재고 롤백 스케줄러  분산락 적용

문제 상황

🚨 여러 인스턴스 환경에서 상품 재고 롤백 스케줄러 실행 시 중복 증가 문제 발생

[서버 A]
1. 조회: 재고 차감 이력 테이블(stock_decrease_history)에서 재고 차감 후 커밋되지 않은 이력 조회
2. 처리: 상품 재고 테이블(top_size_stock) 재고 증가 

[서버 B]
1. 조회: 재고차감 이력 테이블(stock_decrease_history)에서 서버 A와 같은 중복 데이터 조회
2. 처리: 상품 재고 테이블(top_size_stock) 재고 증가 (이미 처리된 건에 대해서도 재고 증가 발생)

 

 

해결방안

❓비관적 락 적용 안한 이유

  1. 두 테이블 간의 데이터 정합성 문제 (재고 차감 이력 테이블, 상품 재고테이블)
  2. 비관적 락 은 해당 테이블(상품 재고) 특정 로우에만 락을 걸어 순차적인 재고 증가 문제는 해결 가능
  3. 하지만 재고 차감 이력 테이블(stock_decrease_history)에서 중복 데이터가 먼저 조회문제는 비관적락과 상관 X
  4. 두 테이블 간 조회 및 처리에 대한 작업을 비관적락으로는 해결 불가

 

분산락 적용

  1. 분산락 획득
  2. 트랜잭션 시작 
  3. rollback 메서드 실행 (커밋되지 않은 이력 조회 후 재고 증가) 
  4. 트랜잭션 종료 
  5. 분산락 해제
  • 먼저 락을 획득한 하나의 서버만 전체 프로세스 실행
  • 다음 서버가 락 획득 후 프로세스 실행으로 불필요한 중복 데이터 조회 및 처리 방지

 

 

처음과 같이 중복 실행되지 않고 하나의 인스턴스에서만 롤백스케줄러를 실행하는것을 확인할 수 있다.

 

 



 

 

'이슈' 카테고리의 다른 글

중고차를 알아보다 작성하는 조회 성능 개선기 (Redis 캐싱)  (0) 2025.02.14
RDB vs Elasticsearch 검색 성능 비교  (1) 2025.01.10
Kafka, Redis를 활용한 이벤트 중복 처리 방지  (2) 2024.12.19
[Jenkins] 용량 부족 - EBS 볼륨 연결  (1) 2024.11.19
AWS EC2 배포 작업  (1) 2023.09.07
  1.  
  2. 재고 차감 동시성 문제
  3.  
  4. 문제 상황
  5. 해결 방안 고민
  6. 재고 롤백 스케줄러  분산락 적용
  7. 문제 상황
  8. 해결방안
  9. ❓비관적 락 적용 안한 이유
'이슈' 카테고리의 다른 글
  • 중고차를 알아보다 작성하는 조회 성능 개선기 (Redis 캐싱)
  • RDB vs Elasticsearch 검색 성능 비교
  • Kafka, Redis를 활용한 이벤트 중복 처리 방지
  • [Jenkins] 용량 부족 - EBS 볼륨 연결
유당불내증이 있는 개발자
유당불내증이 있는 개발자
  • 유당불내증이 있는 개발자
    보초개발
    유당불내증이 있는 개발자
  • 전체
    오늘
    어제
    • 분류 전체보기
      • DB
      • Java
      • 이슈
      • 책
        • 객체지향의 사실과 오해
        • 자바의 신
        • 스프링 입문을 위한 자바 객체 지향의 원리와 이해
        • 토비의 스프링
        • 모던 자바 인 액션
        • 이펙티브 자바
        • Real MySQL 8.0
        • 자바 성능 튜닝이야기
        • 만들면서 배우는 클린 아키텍처
      • 인프런 강의
        • Practical Testing: 실용적인 테스트..
        • Jenkins를 이용한 CICD Pipeline ..
        • 비전공자도 이해할 수 있는 쿠버네티스 입문,실전
        • 대기업 근무하며 경험한 Redis를 야무지게 사용..
      • TIL
  • 인기 글

  • 태그

    EC2
    explain
    MySQL
    AWS
    redis
    db
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
유당불내증이 있는 개발자
상품 재고 관리 - 비관적 락 vs 분산 락 적용 사례
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.