데이터베이스

낙관적 락과 비관적 락

Jinwookoh 2025. 4. 17. 23:50

 

낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)은 **동시성 제어(concurrency control)**를 위한 두 가지 대표적인 전략입니다. 주로 데이터베이스나 ORM(JPA 등)에서 다중 트랜잭션이 동시에 동일한 데이터를 조작할 때 발생할 수 있는 **경쟁 상태(race condition)**나 데이터 무결성 문제를 방지하기 위해 사용됩니다.


🟢 낙관적 락 (Optimistic Lock)

✅ 개념

  • 충돌이 거의 없을 것이라는 전제 하에 동작.
  • 트랜잭션 동안 락을 걸지 않고, 최종 커밋 시점에 버전 정보나 타임스탬프를 비교하여 충돌을 감지함.
  • 충돌이 나면 커밋을 실패시키고, 예외를 발생시켜 롤백하거나 재시도.

✅ 구현 방식 (JPA 기준)

  • @Version 애너테이션을 사용하여 엔티티에 버전 필드 추가.
@Entity
public class Product {
    @Id
    private Long id;

    private String name;

    @Version
    private Integer version;
}

✅ 장점

  • 락을 걸지 않아 병렬성이 높음.
  • 읽기 위주의 시스템에 적합.

✅ 단점

  • 동시 수정이 잦을 경우 충돌이 자주 발생해 재시도 비용이 발생함.

🔴 비관적 락 (Pessimistic Lock)

✅ 개념

  • 충돌이 일어날 가능성이 높다고 가정하고, 데이터를 읽는 순간부터 락을 걸어 다른 트랜잭션의 접근을 차단.
  • SELECT FOR UPDATE 같은 SQL 구문을 통해 구현.

✅ 구현 방식 (JPA 기준)

Product product = entityManager.find(Product.class, 1L, LockModeType.PESSIMISTIC_WRITE);

✅ 락 타입

  • PESSIMISTIC_READ: 읽기 전용 락.
  • PESSIMISTIC_WRITE: 쓰기 락. 다른 트랜잭션이 읽지도 못하게 함.

✅ 장점

  • 동시성 충돌을 확실하게 방지함.
  • 수정이 빈번한 데이터에 적합.

✅ 단점

  • 락을 거는 동안 다른 트랜잭션이 대기해야 하므로 성능 저하 우려.
  • 데드락 발생 가능성 존재.

📌 요약 비교

항목 낙관적 락 (Optimistic) 비관적 락 (Pessimistic)
락 시점 커밋 시 충돌 감지 데이터 읽는 순간부터 락
병행성 높음 낮음
충돌 발생 시 예외 발생, 롤백 및 재시도 필요 트랜잭션이 대기하거나 실패
사용 적합 상황 충돌이 드문 경우 충돌이 빈번한 경우
JPA 사용 방식 @Version LockModeType.PESSIMISTIC_*