inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

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

529

김금빛

작성한 질문수 6

0

동시성1.png

StockService.decrease 메소드의 경우

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

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

 

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

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

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

java spring 동시성

답변 1

0

최상용

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

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

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

감사합니다 :)

레디선 테스트코드에서 채널이름은 없어도 되는건가요?

0

37

2

낙관적 락을 사용할 떄 차이점

0

117

2

동시성 검증 코드에 관한 문의

0

88

2

단일연산

0

68

2

낙관적락vs. 레디스락

0

103

2

안녕하세요. 레디슨 질문있습니다..!!

0

65

2

@Lock(OPTIMISTIC)이 필요한 이유

0

88

2

get_lock 의 timeout이 3000초 이던데 너무 긴거 아닌가요?

0

128

2

DataSource Hikari 사용 이유

0

142

2

saveAndFlush 사용 이유 문의

0

111

3

비관적 락 VS 네임드 락

0

155

3

application.yaml 에 redis 정보

0

96

2

왜 클래스 이름에 Facade 가 붙나요?

0

180

2

@Transactional 으로 인한 동시성 문제 발생 원인이 궁금합니다.

0

215

2

@modifying 이용한 동시성 제어

0

166

2

DB락과 분산락

0

258

2

NamedLock 테스트 실패

0

186

2

테스트에서 트랜잭션 어노테이션 질문 있습니다.

0

168

2

optimistic Lock 재시도 질문입니다.

0

229

2

낙관적 락 테스트 실패

0

238

2

오류?

0

1623

4

LettureLockStockFacadeTest에서 오류가 발생합니다.

1

264

2

Pessimistic Lock 전체 테스트 오류 문의

0

353

3

비관적 락 vs 레디스(Lettuce)락 비교 관련 질문

0

453

2