Trouble Shooting 3

MySQL에서 의도치 않게 조회시 레코드에 S락을 거는 문제

지난 번 프로젝트에서도 그렇고 이번 프로젝트에서도 동시성을 테스트하는 상황에서 데드락이 발생했다. 데드락 발생 원인을 알고자 InnoDB 로그를 살펴보니, 의도치 않게 조회시 레코드에 S락을 걸면서 데드락이 발생한 것이었다. 이에 대해 더 자세히 알아보자.MySQL이 락을 거는 방식결론부터 말하자면 MySQL은 외래키 제약이 테이블에 정의되어 있으면 레코드 삽입, 수정, 삭제시에 해당 참조 레코드에 S락을 건다. 공식 문서에서는 다음과 같이 말한다.If a FOREIGN KEY constraint is defined on a table, any insert, update, or delete that requires the constraint condition to be checked sets shared..

Trouble Shooting 2024.05.21

멀티 스레드 환경에서 @Transactional을 사용할 때 주의할 점

이 글에서 소개하는 내용은 동시성 환경을 테스트하기 위한 테스트 코드를 작성하던 중에 만난 문제이다. 문제우선 다음과 같이 동시성 환경을 테스트하기 위한 테스트 코드를 작성했다. 게시글인 post 엔티티를 save() 한 후10개의 스레드에서 해당 엔티티를 조회해와서 좋아요를 등록한다.@Transactional@SpringBootTestclass PostServiceTest { @Autowired private PostService postService; @Autowired private PostRepository postRepository; @Test @DisplayName("좋아요 등록 성공-한 사람이 동시에 여러번 좋아요를 눌러도 중복 저장되지 않아야 한다.") void ..

Trouble Shooting 2024.05.20

테스트 코드에서 @Transactional이 적용되지 않는 문제

상황 설명ScheduleService에 대한 테스트 코드를 작성하던 중에 다음 에러가 발생했다. Exception in thread "pool-5-thread-6" org.springframework.dao.InvalidDataAccessApiUsageException: Query requires transaction be in progress, but no transaction is known to be in progressCaused by: jakarta.persistence.TransactionRequiredException: Query requires transaction be in progress, but no transaction is known to be in progress찾아보니 트랜잭션..

Trouble Shooting 2024.05.14