Lock을 획득하려고할시, 트랜잭션 환경 이여야한다

Terror·2024년 10월 30일

최종 프로젝트

목록 보기
8/28

오류

코드

    @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

profile
테러대응전문가

0개의 댓글