728x90
@Lock 어노테이션이란❓
@Lock 어노테이션은 Spring Data JPA에서 제공하는 기능으로, JPA 리포지토리 메소드에 적용하여 특정 데이터베이스 쿼리에 대한 잠금 모드를 지정하는 데 사용됩니다.
이 어노테이션은 동시성 제어를 위해 사용되며, 여러 트랜잭션이 동시에 동일한 데이터를 수정하려고 할 때 발생할 수 있는 충돌을 방지합니다.
LockModeType의 잠금 모드
@Lock 어노테이션은 javax.persistence.LockModeType을 사용하여 JPA에서 지원하는 다양한 잠금 모드 중 하나를 지정할 수 있습니다. 이를 통해 특정 엔티티나 쿼리에 대해 잠금 정책을 설정하고, 트랜잭션이 안전하게 수행될 수 있도록 합니다.
LockModeType.PESSIMISTIC_READ
- 비관적 읽기 잠금
- 데이터를 읽을 때 다른 트랜잭션이 해당 데이터를
수정할수 없도록 잠금을 겁니다.
- 데이터를 읽을 때 다른 트랜잭션이 해당 데이터를
- 사용 사례
- 데이터 조회 시 다른 트랜잭션이 데이터를 수정하는 것을 방지해야 할 때 사용됩니다.
- 여러 트랜잭션이 동시에 데이터를 읽을 수 있지만, 이 잠금을 걸면 다른 트랜잭션이 쓰기 작업을 할 수 없습니다.
LockModeType.PESSIMISTIC_WRITE
- 비관적 쓰기 잠금
- 데이터를 수정할 때 사용되며, 다른 트랜잭션이 해당 데이터를
읽거나 수정하지 못하게 합니다.
- 데이터를 수정할 때 사용되며, 다른 트랜잭션이 해당 데이터를
- 사용 사례
- 데이터 수정 시 다른 트랜잭션의 접근을 완전히 차단하여 충돌을 방지하고 데이터 일관성을 보장해야 할 때 사용됩니다.
- 예를 들어, 재고 수량을 업데이트할 때 여러 트랜잭션이
동시에 접근할 수 없도록 합니다.
LockModeType.PESSIMISTIC_FORCE_INCREMENT
- 비관적 강제 증가 잠금
- PESSIMISTIC_WRITE와 유사하지만, 이 잠금을 사용할 경우 데이터의 버전 정보도 강제로 증가시킵니다.
- 사용 사례
- 버전 관리를 통해 동시성 제어를 강화하고자 할 때 사용됩니다.
- 예를 들어, 특정 데이터에 대한 수정이 발생할 때마다 명시적으로 버전 번호를 증가시켜야 하는 상황에서 유용합니다.
LockModeType.OPTIMISTIC
- 낙관적 잠금
- 트랜잭션이 완료될 때 충돌이 발생했는지 확인합니다.
- 일반적으로 엔티티의 버전 필드를 사용하여 충돌 여부를 판단합니다.
- 사용 사례
- 동시성 충돌이 드문 환경에서 성능을 우선시하는 경우 사용됩니다.
- 트랜잭션 동안에는
잠금을 사용하지 않으며, 커밋 시점에서만 충돌을 체크합니다.
LockModeType.FORCE_INCREMEN
- 낙관적 강제 증가 잠금
- OPTIMISTIC과 유사하지만, 이 잠금을 사용할 경우 트랜잭션이 완료될 때 버전 정보가 강제로 증가합니다.
- 사용 사례
- 낙관적 락을 사용하면서도 데이터의 버전 관리를 강화하고 싶을 때 사용됩니다.
- 트랜잭션이 성공적으로 끝나면 데이터의 버전이 자동으로 증가합니다.
LockModeType.READ
- 읽기 잠금
- 주로 JPA의 캐시에서 데이터를 읽을 때 사용되는 잠금 모드입니다.
- 엔티티에 대한 업데이트는 허용되지만, 특정 상황에서는 데이터의 버전을 읽기 전용으로 설정할 수 있습니다.
- 사용 사례
- 특정 엔티티를 읽기 전용으로 사용하고, 해당 엔티티의 데이터가 변경되지 않도록 해야 하는 경우에 사용됩니다.
LockModeType.WRITE
- 쓰기 잠금
- 엔티티를 업데이트할 때 사용하는 잠금 모드로, JPA 캐시에서 사용됩니다.
- 데이터의 일관성을 유지하기 위해 데이터에 쓰기 잠금을 설정합니다.
- 사용 사례
- 데이터베이스의 특정 레코드에 대해 쓰기 작업을 할 때 JPA 캐시에서 일관성을 유지해야 하는 경우에 사용됩니다.
LockModeType.NONE
- 잠금 없음
- JPA는 데이터에 대해
아무런 잠금을 설정하지 않습니다. 기본적으로 트랜잭션에서동시성 제어를 하지 않고, 다른 트랜잭션의 영향을 받을 수 있습니다.
- JPA는 데이터에 대해
- 사용 사례
- 동시성 문제가 발생하지 않는 경우나, 동시성 제어가 필요 없는 간단한 읽기 작업 등에 사용됩니다.
'Framework > JPA' 카테고리의 다른 글
[JPA] JPA에서 낙관적 락(Optimistic Locking)을 통한 동시성 제어하기 (@Version) (0) | 2024.08.22 |
---|---|
[JPA] 비관적 락(Pessimistic Lock)을 통한 동시성 제어 및 업데이트 손실(Lost Update)확인하기 (0) | 2024.08.21 |
[JPA] Query Method란 무엇일까 ❓ (0) | 2024.07.27 |
[JPA] JPA Auditing란 무엇일까❓(@EnableJpaAuditing, @MappedSuperclass, @EntityListeners) (0) | 2024.07.27 |
[JPA] JPA의 복잡함을 줄이는 Spring Data JPA (0) | 2024.07.27 |