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

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);
}작업이 모두 종료되기 이전에 테스트 케이스가 종료됩니다.
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





