TIL

[TIL] DB Lock | 비관적 락 (Pessimistic Locking) | 낙관적 락 (Optimistic Locking)

dev_ajrqkq 2024. 8. 20. 01:35

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을 찾을 수 없으므로(버전이 올라감) 데이터 수정이 불가능하다.