DB Lock 이란?
데이터베이스에서 여러 트랜잭션이 동시에 같은 데이터에 접근할 때, 데이터의 무결성을 보장하기 위해 사용되는 메커니즘이다.
쉽게 말하면, 작업중인 데이터는 건들 수 없게 만드는 것!!이다. 이를 통해 충돌을 방지하고 데이터의 일관성을 유지 할 수 있다.
비관적 락 실습
비관적 락은 데이터를 읽을 때부터 락을 걸어 다른 트랜잭션이 접근하지 못하도록 하는 방식으로 데이터의 충돌 가능성이 높을 때 유용하다.
public interface ItemRepository extends JpaRepository<Item, Long> {
@Lock(LockModeType.PESSIMISTIC_WRITE) // 비관적 락 적용
@Query("select i from Item i where i.id = :id")
Item findByIdWithLock(Long id);
}
PESSIMISTIC_READ
읽기 락(Shared Lock)을 설정하여 다른 트랜잭션이 해당 데이터를 읽을 수는 있지만, 수정은 할 수 없음
PESSIMISTIC_WRITE
쓰기 락(Exclusive Lock)을 설정하여 다른 트랜잭션이 해당 데이터를 읽거나 수정하지 못하도록 함
낙관적 락 실습
낙관적 락은 데이터를 수정하기 전까지 락을 걸지 않고, 수정 시점에만 충돌을 확인하는 방식이다.
주로 데이터의 버전 번호를 사용하여 동시성 문제를 해결한다.
import jakarta.persistence.*;
import lombok.Data;
@Data
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Double price;
@Version
private Integer version; // 버전 필드를 통해 낙관적 락을 구현
}
동시에 실행 한 두 트랙잭션에 대해,,
첫 번째 트랙잭션에서 데이터 수정 시 버전이 0에서 1로 올라간다.
두 번째 트랙잭션에서는 버전 0을 찾을 수 없으므로(버전이 올라감) 데이터 수정이 불가능하다.
'TIL' 카테고리의 다른 글
[TIL] Write-Behind 캐싱 구현 (0) | 2024.08.21 |
---|---|
[TIL] 장애대응 (0) | 2024.08.20 |
[TIL] Session Clustering (0) | 2024.08.17 |
[TIL] 모니터링 (0) | 2024.08.16 |
[TIL] SAGA Pattern (0) | 2024.08.16 |