작성자 없음
작성자 정보가 삭제된 글입니다.
해결된 질문
작성
·
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
을 붙이면 테스트가 첫 스레드풀 사이즈 만큼의 쿼리만 나가고 계속 대기 중입니다.
혹시 원인을 알수 있을까요?
답변 1
1
sagadadd 님 안녕하세요.
@Transactional 어노테이션을 붙이면 메소드 실행전에 트랜잭션을 취득하고 메소드가 종료된 이후에 트랜잭션을 반납하게 됩니다.
Test method 가 트랜잭션을 취득한 상태에서 A 스레드가 쿼리가 실행되는순간 락을 취득하게 됩니다.
그리고 B (A 이외의 다른) 스레드에서 데이터를 가져가려고할때 이미 락이 걸려있기때문에 락이 종료될때까지 기다리게됩니다.
락이 종료되려면 메소드가 종료되어야 하는데, B 스레드가 아직 락을 기다리는중이기때문에 메소드가 종료되지 않습니다.
그렇기에 계속 대기하는것입니다.
추가적인 질문이 있으시다면 댓글 혹은 질문 남겨주세요!
감사합니다.
자세한 답변 주셔서 감사합니다.