-
Notifications
You must be signed in to change notification settings - Fork 0
최세민 8주차 학습 일지
Semin Choi edited this page Aug 19, 2024
·
1 revision
낙관락이란? 낙관락은 @Version이라는 어노테이션을 사용해서 DB 수준의 락을 사용하지 않고 충돌을 감지합니다. 조회할 때 현재 레코드의 version 컬럼을 확인하고, Update 쿼리를 수행할 때 where절에 버전정보를 포함하여 충돌을 감지하는 원리로 작동합니다.
비관락 JPA의 비관락에는 다음과 같은 종류가 있습니다.
- PESSIMISTIC_WRITE
- MySQL에서 사용할 때
Select ... For Update
쿼리를 사용하는 것과 같습니다. - 해당 락이 걸린 레코드에 읽기, 쓰기를 모두 접근할 수 없다는 설명이 많아서 혼란스러웠으나 기본 설정인 Repeatable Read를 사용하면 락을 사용하지 않은 다른 쿼리는 정상적으로 수행할 수 있는 것을 테스트를 통해 확인했습니다.
- MySQL에서 사용할 때
- PESSIMISTIC_READ
- MySQL에서 사용할 때
Select ... For Share
쿼리를 사용하는 것과 같습니다. - 공유락이 배타락으로 승격되어 데드락에 빠지는 것을 주의해야 합니다.
- MySQL에서 사용할 때
문제 상황 DataJpaTest를 하게 되면 자동으로 테스트 메소드에 트랜잭션이 적용됩니다. 테스트가 시작할때 트랜잭션을 시작하고, 테스트가 끝날 때 롤백을 합니다. 실제로 데이터를 커밋하는 것이 아니기 때문에 메인스레드에서 insert한 레코드를 아닌 다른 스레드에서 select 쿼리를 이용해 조회하려 해도 조회할 수 없었습니다.
문제 해결
@Sql
어노테이션과 config = @SqlConfig(transactionMode = SqlConfig.TransactionMode.ISOLATED))
옵션을 사용하여 테스트 메소드가 시작되기 전 독립된 트랜잭션에서 쿼리를 수행하도록 하여 문제를 해결했습니다.