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

파이리이2님의 프로필 이미지
파이리이2

작성한 질문수

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

Optimistic Lock 활용해보기

OptimisticFacade, LettuceLockStockFacade 에 대해 @Transactional 질문

해결된 질문

작성

·

465

·

수정됨

0

강의 잘 듣고 있습니다.

다름이 아니라 OptimisticFacade 클래스의 decrease  메서드는 트랜잭션을 붙히지 않으셨는데 이는 optimisticLockStockService.decrease가 실질적인 DB 와 통신하는 부분이기 때문에 optimisticLockStockService.decrease에서만 @Transactional을 적용시켜야 하기 때문인것인가요??

 

또한, LettuceLockStockFacade의 경우 redisLockRepository에 접근하는 부분이 있는데, 레디스에 접근시에는 트랜잭션을 걸어주지 않아도 될까요?

또한, 제가 알기로는 @Query를 사용하는 경우 @Transactional이 적용되지 않는다고 알고 있는데, 그렇다면 Pessimistic과 Optimistic 의 decrease 메서드의 경우 @Transactional이 없어도 괜찮은것 일까요?

답변 1

0

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

최필환님 안녕하세요.
Q. OptimisticFacade 클래스의 decrease  메서드는 트랜잭션을 붙히지 않으셨는데 이는 optimisticLockStockService.decrease가 실질적인 DB 와 통신하는 부분이기 때문에 optimisticLockStockService.decrease에서만 @Transactional을 적용시켜야 하기 때문인것인가요??

A. OptimisticFacade 에 @Transactional 을 걸게 되면 계속해서 동일한 데이터를 가져오게 됩니다.
그렇기때문에 트랜잭션을 걸지않음으로써 갱신된 데이터를 가져오는 것을 의도하였습니다.
또한 Facade 클래스는 재시도를 위해 존재하는 클래스이므로 근본적으로 트랜잭션이 필요없는 클래스라 걸지 않았습니다.

 

Q. LettuceLockStockFacade의 경우 redisLockRepository에 접근하는 부분이 있는데, 레디스에 접근시에는 트랜잭션을 걸어주지 않아도 될까요?

A. 첫번째로 레디스와 mysql 은 별도의 데이터베이스므로 @Transactional 을 선언한다고 트랜잭션이 보장되지 않습니다. 별도의 처리를 해주어야 합니다.
두번째이유로는 lock 을 획득하고 반납하는 것이 목적이고 이것은 재고감소의 트랜잭션과 분리 되어야 하기때문에 Facade 클래스에는 트랜잭션을 선언하지 않았습니다.

 

Q. 제가 알기로는 @Query를 사용하는 경우 @Transactional이 적용되지 않는다고 알고 있는데, 그렇다면 Pessimistic과 Optimistic 의 decrease 메서드의 경우 @Transactional이 없어도 괜찮은것 일까요?

A. service class method 에서 @Transactional 어노테이션이 붙어있기 때문에 괜찮습니다.
Pessimistic과 Optimistic 의 decrease 메서드의 경우 @Transactional 에는 존재해야 합니다.

 

파이리이2님의 프로필 이미지
파이리이2
질문자

답변감사합니다! 디테일한 부분까지 더 공부해봐야겠네요!

파이리이2님의 프로필 이미지
파이리이2

작성한 질문수

질문하기