https://sundaland.tistory.com/431
[ ▶ Locking ]
Locking은 데이터베이스에서 동시성을 관리하는 중요한 메커니즘으로, 여러 트랜잭션이 데이터에 접근할 때 데이터 무결성을 보장하기 위해 사용된다. Spring Data JPA에서는 @Lock 어노테이션을 사용하여 쿼리 메서드나 CRUD 메서드에 잠금 모드를 지정할 수 있다.
[ ▷ 쿼리 메서드에서 Lock 모드 정의하기 ]
쿼리 메서드에 @Lock 어노테이션을 사용하여 사용할 잠금 모드를 지정할 수 있다. 예를 들어, LockModeType.READ를 사용하면 해당 쿼리가 읽기 전용 잠금으로 실행된다. 이렇게 하면 다른 트랜잭션에서 동일한 데이터에 대한 변경 작업을 할 수 없게 되어, 데이터 무결성이 유지된다.
interface UserRepository extends Repository<User, Long> {
// 일반 쿼리 메서드
@Lock(LockModeType.READ)
List<User> findByLastname(String lastname);
}
[ ▷ CRUD 메서드에서 Lock 모드 정의하기 ]
CRUD 메서드에서도 잠금 메타데이터를 정의할 수 있다. 이를 위해 해당 메서드를 repository 인터페이스에서 재정의하고, @Lock 어노테이션을 추가한다.
interface UserRepository extends Repository<User, Long> {
// CRUD 메서드의 재정의
@Lock(LockModeType.READ)
List<User> findAll();
}
위 코드에서는 findAll() 메서드를 재정의하면서 @Lock(LockModeType.READ)를 추가했다. 이를 통해 findAll() 메서드 호출 시 전체 사용자의 데이터를 읽을 때 읽기 잠금이 적용된다. 이 경우 다른 트랜잭션에서 사용자의 데이터에 대한 수정이 불가능해지므로, 데이터의 일관성을 보장할 수 있다.
[ ▷ LockModeType의 종류 ]
Spring Data JPA에서 사용할 수 있는 LockModeType의 종류는 다음과 같다.
- LockModeType.READ: 읽기 잠금으로, 다른 트랜잭션에서 수정할 수 없게 한다.
- LockModeType.WRITE: 쓰기 잠금으로, 해당 데이터에 대한 모든 접근을 차단한다.
- LockModeType.OPTIMISTIC: 낙관적 잠금으로, 데이터 변경 시점에 버전 체크를 통해 충돌을 감지한다.
- LockModeType.OPTIMISTIC_FORCE_INCREMENT: 낙관적 잠금이며, 항상 버전 번호를 증가시킨다.
- LockModeType.PESSIMISTIC_READ: 비관적 읽기 잠금으로, 다른 트랜잭션에서 해당 데이터를 수정할 수 없게 한다.
- LockModeType.PESSIMISTIC_WRITE: 비관적 쓰기 잠금으로, 다른 트랜잭션에서 해당 데이터를 읽거나 수정할 수 없게 한다.
이처럼 Spring Data JPA의 @Lock 어노테이션을 통해 트랜잭션 내에서 데이터 접근에 대한 잠금을 설정할 수 있다. 이를 통해 여러 트랜잭션이 동시에 같은 데이터에 접근할 때 발생할 수 있는 문제를 예방하고, 데이터 무결성을 유지할 수 있다.
'Spring Boot > Spring Data JPA' 카테고리의 다른 글
PESSIMISTIC_READ, PESSIMISTIC_WRITE (0) | 2024.10.25 |
---|---|
OPTIMISTIC, OPTIMISTIC_FORCE_INCREMENT (0) | 2024.10.25 |
Transactionality (0) | 2024.10.25 |
Projections (0) | 2024.10.25 |
Query Hint (0) | 2024.10.24 |