본문 바로가기
Java/Spring

Spring) 비관적 락으로 인한 오류와 해결

by NH_club 2023. 8. 7.

문제 상황:

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