PESSIMISTIC_READ, PESSIMISTIC_WRITE

2024. 10. 22. 18:51Spring Boot/Spring Data JPA

PESSIMISTIC_READ

비관적 읽기 잠금(Pessimistic Read Lock)은 데이터베이스에서 데이터의 일관성과 무결성을 보장하기 위해 사용되는 잠금 전략 중 하나입니다. 이 잠금 방식은 다른 트랜잭션이 데이터를 수정할 수 없도록 하여 읽기 작업 중에 데이터의 변경을 방지합니다. 아래에서 비관적 읽기 잠금에 대해 설명하겠습니다.

비관적 읽기 잠금(Pessimistic Read Lock)

비관적 읽기 잠금은 주로 다음과 같은 경우에 사용됩니다:

  • 동시성 제어: 여러 트랜잭션이 동시에 같은 데이터를 읽거나 쓸 수 있는 경우, 데이터의 일관성을 유지하기 위해 비관적 잠금을 사용합니다. 이 잠금 방식은 데이터의 무결성을 유지하기 위해 다른 트랜잭션의 수정 작업을 차단합니다.
  • 데이터 충돌 예방: 데이터 변경이 발생할 가능성이 있는 환경에서, 비관적 읽기 잠금을 사용하면 다른 트랜잭션이 데이터를 수정할 수 없도록 하여 충돌을 예방할 수 있습니다.

사용 방법

Spring Data JPA에서는 @Lock 어노테이션을 사용하여 비관적 읽기 잠금을 설정할 수 있습니다. 예를 들어, LockModeType.PESSIMISTIC_READ를 사용하여 비관적 읽기 잠금을 정의할 수 있습니다.

예시: 비관적 읽기 잠금 사용

import org.springframework.data.jpa.repository.Lock;
import org.springframework.data.repository.Repository;
import javax.persistence.LockModeType;

interface UserRepository extends Repository<User, Long> {

    // 비관적 읽기 잠금 적용
    @Lock(LockModeType.PESSIMISTIC_READ)
    User findById(Long id);
}

위의 코드에서 findById 메서드는 LockModeType.PESSIMISTIC_READ 잠금을 사용하도록 설정되었습니다. 이 메서드가 호출되면 해당 데이터에 대한 비관적 읽기 잠금이 적용되어, 다른 트랜잭션에서 해당 사용자의 데이터를 수정할 수 없게 됩니다.

비관적 읽기 잠금의 특징

  1. 데이터 수정 차단: 비관적 읽기 잠금이 적용된 상태에서는 다른 트랜잭션이 해당 데이터에 대해 수정 작업을 할 수 없습니다. 이는 데이터의 일관성을 보장하는 데 중요한 역할을 합니다.
  2. 성능 저하 가능성: 비관적 잠금을 사용하면 트랜잭션 대기 시간이 증가할 수 있으므로, 과도한 비관적 잠금은 성능 저하를 초래할 수 있습니다. 따라서 필요할 때만 사용하는 것이 좋습니다.
  3. 트랜잭션의 범위: 비관적 읽기 잠금을 사용하면 읽기 작업 중 다른 트랜잭션이 수정할 수 없게 되므로, 해당 트랜잭션이 완료될 때까지 데이터의 상태가 안정적으로 유지됩니다.

비관적 읽기 잠금은 데이터 무결성을 유지하기 위한 유용한 도구로, 동시성 제어가 필요한 경우에 적합합니다. 하지만 잠금으로 인한 성능 저하를 염두에 두고, 필요한 경우에만 사용하도록 해야 합니다.

PESSIMISTIC_WRITE

PESSIMISTIC_WRITE는 데이터베이스의 비관적 잠금 전략 중 하나로, 특정 데이터에 대해 쓰기 잠금을 적용하는 방식입니다. 이 잠금 모드는 다른 트랜잭션이 해당 데이터에 대한 읽기나 쓰기 작업을 수행하지 못하도록 막아, 데이터의 일관성과 무결성을 보장합니다. 아래에서 PESSIMISTIC_WRITE에 대해 설명하겠습니다.

PESSIMISTIC_WRITE (비관적 쓰기 잠금)

정의

  • 비관적 쓰기 잠금은 데이터에 대한 변경 작업을 수행할 때 다른 트랜잭션이 해당 데이터를 읽거나 수정하는 것을 방지합니다. 즉, 특정 데이터에 대한 쓰기 작업이 진행되는 동안 해당 데이터에 대한 모든 접근을 차단하여 데이터 무결성을 보장합니다.

사용 목적

  • 데이터 충돌 방지: 여러 트랜잭션이 동시에 동일한 데이터를 수정하려고 할 때 발생할 수 있는 충돌을 예방합니다.
  • 일관성 유지: 트랜잭션이 완료될 때까지 데이터의 일관성을 유지할 수 있도록 합니다. 이는 특히 여러 사용자가 동시에 데이터에 접근하는 환경에서 유용합니다.

사용 방법

Spring Data JPA에서 PESSIMISTIC_WRITE를 사용하려면 @Lock 어노테이션을 이용하여 쿼리 메서드에 잠금을 설정할 수 있습니다. 다음은 PESSIMISTIC_WRITE를 사용하는 예시입니다.

예시: 비관적 쓰기 잠금 사용

import org.springframework.data.jpa.repository.Lock;
import org.springframework.data.repository.Repository;
import javax.persistence.LockModeType;

interface UserRepository extends Repository<User, Long> {

    // 비관적 쓰기 잠금 적용
    @Lock(LockModeType.PESSIMISTIC_WRITE)
    User findById(Long id);
}

위의 코드에서 findById 메서드는 LockModeType.PESSIMISTIC_WRITE 잠금을 사용하도록 설정되었습니다. 이 메서드가 호출되면 해당 사용자의 데이터에 비관적 쓰기 잠금이 적용되어, 다른 트랜잭션에서 해당 데이터를 읽거나 수정할 수 없게 됩니다.

PESSIMISTIC_WRITE의 특징

  1. 완전한 데이터 보호: 쓰기 잠금이 적용된 동안 다른 트랜잭션은 해당 데이터에 대해 어떠한 작업도 수행할 수 없습니다. 이는 데이터의 일관성을 매우 효과적으로 보장합니다.
  2. 성능 저하: 비관적 잠금을 사용하면 대기 시간이 증가할 수 있으며, 트랜잭션이 완료될 때까지 잠금이 유지되므로 성능 저하가 발생할 수 있습니다. 특히 많은 트랜잭션이 동시에 발생하는 환경에서는 잠금 대기가 늘어날 수 있습니다.
  3. 트랜잭션 관리: 비관적 쓰기 잠금을 사용할 때는 적절한 트랜잭션 관리가 필요합니다. 예를 들어, 트랜잭션이 완료되기 전에 예외가 발생하면 잠금이 해제되지 않을 수 있으므로, 이를 처리할 수 있는 로직이 필요합니다.

PESSIMISTIC_WRITE는 데이터의 일관성을 유지하기 위한 강력한 도구로, 데이터 충돌 방지를 위해 특히 유용합니다. 하지만 잠금으로 인한 성능 저하를 고려해야 하며, 필요한 경우에만 사용하는 것이 좋습니다.

'Spring Boot > Spring Data JPA' 카테고리의 다른 글

Auditing  (0) 2024.10.22
OPTIMISTIC, OPTIMISTIC_FORCE_INCREMENT  (0) 2024.10.22
Locking  (0) 2024.10.22
Transactionality  (0) 2024.10.22
Projections  (0) 2024.10.22