Skip to content

최세민 8주차 학습 일지

Semin Choi edited this page Aug 19, 2024 · 1 revision

학습 내용

JPA의 낙관락과 비관락

낙관락이란? 낙관락은 @Version이라는 어노테이션을 사용해서 DB 수준의 락을 사용하지 않고 충돌을 감지합니다. 조회할 때 현재 레코드의 version 컬럼을 확인하고, Update 쿼리를 수행할 때 where절에 버전정보를 포함하여 충돌을 감지하는 원리로 작동합니다.

비관락 JPA의 비관락에는 다음과 같은 종류가 있습니다.

  • PESSIMISTIC_WRITE
    • MySQL에서 사용할 때 Select ... For Update 쿼리를 사용하는 것과 같습니다.
    • 해당 락이 걸린 레코드에 읽기, 쓰기를 모두 접근할 수 없다는 설명이 많아서 혼란스러웠으나 기본 설정인 Repeatable Read를 사용하면 락을 사용하지 않은 다른 쿼리는 정상적으로 수행할 수 있는 것을 테스트를 통해 확인했습니다.
  • PESSIMISTIC_READ
    • MySQL에서 사용할 때 Select ... For Share 쿼리를 사용하는 것과 같습니다.
    • 공유락이 배타락으로 승격되어 데드락에 빠지는 것을 주의해야 합니다.

DataJpaTest 동시성 테스트할 때 다른 스레드에서 메인 스레드가 Insert한 내용을 볼 수 없는 문제

문제 상황 DataJpaTest를 하게 되면 자동으로 테스트 메소드에 트랜잭션이 적용됩니다. 테스트가 시작할때 트랜잭션을 시작하고, 테스트가 끝날 때 롤백을 합니다. 실제로 데이터를 커밋하는 것이 아니기 때문에 메인스레드에서 insert한 레코드를 아닌 다른 스레드에서 select 쿼리를 이용해 조회하려 해도 조회할 수 없었습니다.

문제 해결 @Sql 어노테이션과 config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED)) 옵션을 사용하여 테스트 메소드가 시작되기 전 독립된 트랜잭션에서 쿼리를 수행하도록 하여 문제를 해결했습니다.

👼 개인 활동을 기록합시다.

개인 활동 페이지

🧑‍🧑‍🧒‍🧒 그룹 활동을 기록합시다.

그룹 활동 페이지

🎤 미니 세미나

미니 세미나

🤔 기술 블로그 활동

기술 블로그 활동

📚 도서를 추천해주세요

추천 도서 목록

🎸 기타

기타 유용한 학습 링크

Clone this wiki locally