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

작성자 없음

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

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

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

해결된 질문

작성

·

614

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 스레드가 아직 락을 기다리는중이기때문에 메소드가 종료되지 않습니다.

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

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

감사합니다.

 

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

 

작성자 없음

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

질문하기