문제 상황:
Idea 테이블에 비관적 락을 걸고, 메서드 BidReservation과 findOneIdea를 실행하면

읽기 전용 트랙잭션에서는 SELECT FOR NO KEY UPDATE 명령을 실행할 수 없다고 뜬다.
하지만 똑같이 @Transaction(readOnly = true)가 걸려있는 전제 조회(findAllIdea)에선 정상적으로 실행 된다.
왜 이런 현상이 발생하는지 이유를 찾아보자!!!!!
문제가 일어난 이유:

현재 findById에 비관적 락을 걸어놨다.
비관적 락은 실행이 되면 DB레벨에서 해당 트랜잭션에 쓰기락을 걸어 다른 요청이 동시에 접근할 수 없고, 각 요청들이 동기방식으로 처리된다.
한마디로 findById를 사용한 로직에는 findById가 실행이 될 때 비관적 락이 걸리며, 비관적 락은 기본적으로 @Transaction 애노테이션이 필요하고, 읽기 전용 트랜잭션에선 비관적 락을 사용할 수가 없기 때문에 발생하는 오류였다.
현재 동시성 제어를 해주어야 하는 입찰에만 락을 걸어주면 되는데, 변수명을 findById로 정의해서 락을 걸 필요가 없는 다른 서비스 로직에서 findById를 사용하면 비관적 락이 적용되는 상황이다.
해결 방안:
변수명을 바꿔서 선언 하였고, 입찰 때만 비관적 락을 걸어주도록 수정했다.

여러번의 테스트 결과 동시에 보낸 요청에 대하여 정상적인 입찰이 확인 되었다.
@Transaction 삭제한 BidReservation 과 @Transaction(readOnly = true)를 붙인 findOneIdea 메서드도 정상 실행되는 것을 확인하였다.
'Java > Spring' 카테고리의 다른 글
Spring) Transaction 처리 속도 향상 (0) | 2023.08.28 |
---|---|
Spring) 실시간 통신 방식 선정 (0) | 2023.08.08 |
Spring) 동시성 제어 (0) | 2023.08.06 |
Spring) 테스트 코드 작성하기 (0) | 2023.08.03 |
Spring) Spring Security (0) | 2023.07.24 |