오류

코드
@Override
public ApiResponse<Void> updateMatching(Long matchingId, MatchingRequest.MatchingRequestUpdate updateReqDto, AuthUser authUser) {
try {
User user = User.fromAuthUser(authUser);
Matching findMatching = matchingRepository.findByIdWithOptimisticLock(matchingId);
MatchingValidator.isMe(user.getId(),findMatching.getUser().getId());
Matching updateMatching = Matching.builder()
.id(findMatching.getId())
.user(findMatching.getUser())
.portfolio(findMatching.getPortfolio())
.outsourcing(findMatching.getOutsourcing())
.status(updateReqDto.status())
.version(findMatching.getVersion())
.build();
matchingRepository.save(updateMatching);
return ApiResponse.of(MATHCING_SUCCESS);
} catch (ObjectOptimisticLockingFailureException e) {
log.error("동시성 문제 발생 ! {}", e.getMessage());
}
return null;
}
발단
- 낙관적락을 Jmeter로 테스트하던중, 분명 낙관적락에 의한 버젼 불일치 문제가 발발되면서도 로그가 찍히지않아 트랜잭션환경을 뻇다가 생긴 문제다
문제의 원인
- JPA @Lock 어노테이션으로 명시적인 Lock을 획득하려는 경우, 호출당시 "활성상태의 트랜잭션이 존재" 해야합니다
해결
- @Transactional 어노테이션을 달아서 활성화 시켜주자
참조 블로그
https://sunba30.tistory.com/21