인프런 커뮤니티 질문&답변

김금빛님의 프로필 이미지
김금빛

작성한 질문수

재고시스템으로 알아보는 동시성이슈 해결방법

@Transactional, synchronized를 동시에 사용하면 재고수량 감소 로직 동시성이 궁금합니다ㅠㅠ

작성

·

462

·

수정됨

0

동시성1.png

StockService.decrease 메소드의 경우

synchronized 가 붙어있어서 하나의 쓰레드만 들어갈 수 있도록 도와주지만,

@Transactional 이 붙어있기에 froxy 객체로 만들어서 동시성이 안됨을 아래 테스트코드로 확인하였습니다.

 

하지만 똑같은 StockService.decrease를 사용하여

CompletableFuture.runAsync를 사용하면 동시성이 보장이됩니다..

똑같이 @Transactional을 사용한 decrease메소드라서 froxy객체로 만들어져서 동시성이 보장 안될것이라 예측했는데 왜 CompletableFuture.runAsync는 동시성 보장이 될까 궁금합니다ㅠㅠ

답변 1

0

최상용님의 프로필 이미지
최상용
지식공유자

김금빛님 안녕하세요.
CompletableFuture 를 이용하여 작성해주신 테스트코드가 의도대로 동작하지 않는 이유는 다음과 같습니다.

1. runAsync 안에 아래와 같은 구문이 존재하며 이 구문은 비동기로 실행되는것이 아니라 재고수량을 감소하면 그 다음에 다음요청을 보내게 됩니다.
그렇기에 동시에 100개를 요청하는 것이 아닌 100개의 요청이 순차적으로 요청되게 됩니다.

for (int i=0; i<100;i++) {
    stockService.decrease(2L, 1L);
}
  1. 작업이 모두 종료되기 이전에 테스트 케이스가 종료됩니다.
    stockService.decrease 구문을 동시에 요청을 하게 되더라다도 작업이 모두 종료되기 이전에 테스트케이스가 종료되기때문에 성공하는것처럼 보이는 문제가 있습니다.
    이를 기다리기 위하여 CountDownLatch 를 사용하시면 좋을 것 같습니다.

감사합니다 :)

김금빛님의 프로필 이미지
김금빛

작성한 질문수

질문하기