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

근3님의 프로필 이미지
근3

작성한 질문수

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

안녕하세요~~ 레디슨관련 질문 드립니다!

작성

·

437

·

수정됨

1

레디슨을 이용하여 락을 획득할 때

lock.tryLock 메서드 내부에서 현재 lock 이 걸려있는 상태이면 여기서 wait 상태로 스레드를 기다리는 상황인 건가요?

그렇다면 available의 결과가 false 가 된 상태는

락을 계속 얻으려고 시도하다가 결국 못받은 상황이라고 이해해도 될까요?

마지막으로 지금은 void 로 레디스 테스트를 위해 리턴값은 따로 지정하지 않았는데 만약 실무에선 해당 상황에선 보통 어떤 값을 리턴해주는게 좋을까요?

 

 추가로..

개인적인 프로젝트에 해당로직을 사용하여 레디슨으로 Lock 을 건 상태에서 동일하게 테스트 코드를 작성하였습니다.

초기 전체 카운트를 저장한 후에 스레드 내부에서 동일한 수량으로 감소하는 로직으로 작성하였지만,

스레드 내부에서 findBy 한 엔티티의 수량이 모두 초기값으로 동일하게 나타나는 현상이 나타났습니다.. 이럴경우 lock이 제대로 이뤄지지 않은 상태로 된것일까요 아니면 스레드 테스트 환경을 잘못 작성한 것일까요...

 

추가 질문에 대한 개인적인 해결방안을 찾았습니다.. 레디슨 락에대한 메서드에 Transactional 어노테이션을 작성했더니 위처럼 동작하는군요... Transactional 어노테이션이 Redisson에 어떤 영향을 주었던 걸까요...

답변 1

0

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

해구니님 안녕하세요.

답변이 늦어져서 죄송합니다.

말씀하신대로 현재 lock 이 걸려있는 상태이면 설정한 시간만큼 락획득을 시도합니다.

lock 획득에 성공하면 true 를, 실패하면 false 를 반환하는것도 맞습니다.

테스트코드에 대해서는 사람마다 방식은 모두 다르겠지만 저는 lock 부분을 따로 클래스로 추출하여 return type 을 boolean 으로 지정한 후 테스트코드를 작성하는편입니다.

감사합니다.

근3님의 프로필 이미지
근3

작성한 질문수

질문하기