인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

작성자 없음

작성자 정보가 삭제된 글입니다.

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

PESSIMISTIC_WRITE 테스트 시 테스트 클래스 위 @Transactional

해결된 질문

작성

·

644

0

@Transactional
@SpringBootTest
class StockServiceTest {

    @Autowired
    private StockService stockService;

    @Autowired
    private PessimisticLockService pessimisticLockService;

    @Autowired
    private StockRepository stockRepository;

    @BeforeEach
    public void before()
    {

안녕하세요

PESSIMISTIC_WRITE 예제처럼 테스트 시에

@Transactional

을 붙이면 테스트가 첫 스레드풀 사이즈 만큼의 쿼리만 나가고 계속 대기 중입니다.

혹시 원인을 알수 있을까요?스크린샷 2023-05-12 오후 7.09.21.png

답변 1

1

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

sagadadd 님 안녕하세요.

@Transactional 어노테이션을 붙이면 메소드 실행전에 트랜잭션을 취득하고 메소드가 종료된 이후에 트랜잭션을 반납하게 됩니다.

Test method 가 트랜잭션을 취득한 상태에서 A 스레드가 쿼리가 실행되는순간 락을 취득하게 됩니다.

그리고 B (A 이외의 다른) 스레드에서 데이터를 가져가려고할때 이미 락이 걸려있기때문에 락이 종료될때까지 기다리게됩니다.

락이 종료되려면 메소드가 종료되어야 하는데, B 스레드가 아직 락을 기다리는중이기때문에 메소드가 종료되지 않습니다.

그렇기에 계속 대기하는것입니다.

추가적인 질문이 있으시다면 댓글 혹은 질문 남겨주세요!

감사합니다.

 

eeeeeqweewqe님의 프로필 이미지

자세한 답변 주셔서 감사합니다.

 

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기