본문 바로가기
자료정리

Lock

by 어떻게말이름이히힝 2025. 3. 27.

Lock

 

1. 낙관적 락 (Optimistic Lock)

특징
- 애플리케이션 레벨에서 관리됨
- 별도의 락을 걸지 않고 트랜잭션 종료 시점에서 데이터 변경 여부를 확인하여 충돌을 감지
- 일반적으로 버전(version) 필드를 사용하여 변경을 감지
- JPA 사용 시 @Version 어노테이션 활용


2. 비관적 락 (Pessimistic Lock)

특징
- 데이터에 접근할 때 즉시 락을 걸어 충돌을 방지
- 락을 거는 방식에 따라 공유 락(S-lock) 과 베타 락(X-lock) 으로 나뉨

 

공유 락 (Shared Lock, S-Lock)
- 여러 트랜잭션이 동시에 읽기(Read) 가능
- 하지만 쓰기(Write)는 불가능

 

베타 락 (Exclusive Lock, X-Lock)

- 하나의 트랜잭션만 데이터를 읽고 수정할 수 있음 (다른 트랜잭션 접근 불가)

 

분산 락 (Distributed Lock)

- 여러 인스턴스가 락을 공유해야 하는 분산 시스템에서 사용

- 락을 DB 자체가 아닌 외부 시스템에서 관리

- Redis, ZooKeeper 등을 활용한 락 관리가 일반적

 

Lock 단위

락 단위 설명 특성
데이터베이스 전체 DB에 락을 거는 방식 구현은 간단하지만 병행성이 낮음
테이블 특정 테이블에 락을 거는 방식  
레코드 특정 행에만 락을 거는 방식 병행성은 높지만 관리가 복잡
필드 특정 컬럼(필드)에만 락을 거는 방식  

 


 

Blocking vs Deadlock

Blocking (차단)

  • 발생 원인
    • 하나의 트랜잭션이 베타 락(X-Lock) 을 걸면, 다른 트랜잭션이 해당 데이터를 사용할 수 없어서 대기 상태가 됨
    • 트랜잭션이 commit 또는 rollback 될 때까지 대기
  • 해결 방법
    • 트랜잭션 지속 시간을 짧게 유지
    • 동시에 같은 데이터를 갱신하는 트랜잭션이 발생하지 않도록 설계
    • LOCK TIMEOUT 설정(특정 시간이 지나면 자동 해제)

Deadlock (교착 상태)

  • 발생 원인
    • 두 개 이상의 트랜잭션이 서로가 필요한 리소스를 점유한 상태에서 무한 대기
  • 해결 방법
    • 트랜잭션이 리소스를 요청하는 순서를 동일하게 유지
    • 트랜잭션 실행 속도를 빠르게 하여 교착 상태 발생 가능성을 낮춤
    • LOCK TIMEOUT 설정하여 특정 시간 후 강제 해제

 

 

'자료정리' 카테고리의 다른 글

Redis 기본 개념, 간단한 사용 방식 정리  (0) 2025.03.27