인프런 커뮤니티 질문&답변

jooh21020님의 프로필 이미지

작성한 질문수

재고시스템으로 알아보는 동시성이슈 해결방법

Named Lock 활용해보기

섹션 3에서의 모든 테스트 케이스가 동작하지 않는데 문제점을 모르겠습니다.

23.06.04 21:06 작성

·

476

0

안녕하세요.
섹션 3의 세 가지 락들을 따라하면서 코드를 작성했습니다.
그런데 세 가지 모두 테스트 케이스가 동작하지 않습니다.

PessimisticLock과 NamedLock 경우 재고가 감소하지 않습니다..

OptimisticLock의 경우는
에서 동작하지 않습니다.

사용한 자바 버전은 17입니다.
소스코드 주소는
https://github.com/torissi/synchronism-issue
입니다.

 

답변 3

2

seonjun Moon님의 프로필 이미지

2023. 07. 01. 23:30

에러 찍어보니까 다음과 같은 에러가 저는 나오더라고요

 


@Transactional
public void decrease(Long id, Long quantity) {
    try {
        lockRepository.getLock(id.toString());
        stockService.decrease(id, quantity);
    } catch (Exception e){
        System.out.println(e);
    }finally {
        lockRepository.releaseLock(id.toString());
    }

}

 

org.springframework.dao.InvalidDataAccessApiUsageException: For queries with named parameters you need to provide names for method parameters; Use @Param for query method parameters, or when on Java 8+ use the javac flag -parameters

 

즉, native query 선언 시 @Param을 설정해 줘야한다는 말입니다.

 

public interface LockRepository extends JpaRepository<Stock, Long> {
    @Query(value = "select get_lock(:key, 3000)", nativeQuery = true)
    void getLock(@Param("key") String key);

    @Query(value = "select release_lock(:key)", nativeQuery = true)
    void releaseLock(@Param("key")String key);
}

 

이렇게 하면 아마 되지 않을까 생각합니다.

 

0

최상용님의 프로필 이미지
최상용
지식공유자

2023. 06. 07. 16:56

jooh21020 님 안녕하세요.

깃헙에서 소스를 확인해보려고 했는데, synchronized 실습까지밖에 업로드가 안된것 같습니다.

혹시 제가 못찾는것이라면 PessimisticLock 이 작성되어있는 소스링크를 주실 수 있으실까요 ?

jooh21020님의 프로필 이미지
jooh21020
질문자

2023. 07. 07. 10:44

안녕하세요.
늦게 답변드려 죄송합니다.
깃 푸시가 안되어 있었습니다 ㅠㅠ
다시 푸시하여 올렸습니다!

0

인프런 AI 인턴님의 프로필 이미지

2023. 06. 06. 21:11

안녕하세요, 인프런 AI 인턴이에요.

문제 해결을 위해서 해당 repository를 살펴보았습니다. 해당 repository의 README.md 파일에 따르면, 테스트 케이스가 동작하지 않는 이유는 MySQL의 버전 차이로 인한 것으로 보입니다.

MySQL 버전에 따라 InnoDB의 동작 방식이 다를 수 있는데, 예를 들어 MySQL 8.0에서는 옵티미스틱 락이 기본 설정으로 활성화되어 있지 않습니다. 이런 이유로 해당 코드가 MySQL 8.0에서 테스트 케이스가 동작하지 않을 수 있습니다.

해결 방법으로는, MySQL 버전을 조정해서 문제를 해결할 수 있을 것 같습니다. 또는, InnoDB의 동작 방식에 관한 조사를 통해 해당 코드를 수정하고 개선할 수 있을 것입니다.

추가적으로, 해당 코드의 데이터베이스 설정 정보는 파일 내부에 하드코딩 되어 있으므로, 다른 개발자가 코드를 사용할 때 주의해야 합니다.

긍정적인 회신이 되지 못해 죄송합니다. 좀 더 도움을 드릴 수 있는 지식공유자들이 계시니, 질문을 게시판에 작성해보시는 것도 좋은 방법입니다.

좋은 결과 있기를 바랍니다. 감사합니다. :)