TIL

DB 비관적 Lock vs 낙관적 Lock

하얀잔디 2025. 3. 17. 15:57

 

락(Lock)이란 무엇인가?

락은 여러 사용자나 프로세스가 동시에 같은 데이터에 접근할 때, 데이터의 일관성과 무결성을 보호하기 위한 메커니즘입니다. 마치 여러 사람이 동시에 같은 문서를 수정하지 못하도록 하는 것과 비슷합니다.

 

 

결론부터 말씀드리면 비관적 락이 조금 더 강한 lock 같은 느낌!

 

 

 

비관적 락(Pessimistic Lock)

"다른 트랜잭션이 내 데이터를 변경할 것이다" 라고 가정하는 방식

특징

  • 데이터를 읽는 시점에 즉시 락을 획득합니다
  • 트랜잭션이 완료될 때까지 다른 트랜잭션은 해당 데이터에 접근할 수 없습니다
  • 동시 접근이 많은 환경에서 대기 시간이 길어질 수 있습니다

 

@Lock(LockModeType.PESSIMISTIC_WRITE)
@Query("SELECT p FROM Product p WHERE p.id = :id")
Product findByIdWithPessimisticLock(@Param("id") Long id);
 

 

사용 상황

  • 실시간 재고 관리 시스템
  • 금융 거래 처리
  • 경쟁이 심한 데이터 수정이 예상되는 경우

 

 

낙관적 락(Optimistic Lock)

"충돌이 거의 발생하지 않을 것이다" 라고 가정하는 방식

특징

  • 데이터를 읽을 때는 락을 걸지 않습니다
  • 데이터 수정 시점에 충돌을 검사합니다 (주로 버전 필드 사용)
  • 충돌이 발견되면 예외를 발생시키고 재시도하도록 합니다

 

@Entity
public class Product {
    @Id
    private Long id;
    
    private String name;
    private int stock;
    
    @Version
    private Long version;
}

 

사용 상황

  • 읽기 작업이 많은 환경
  • 충돌 가능성이 낮은 경우
  • 사용자 프로필 수정 같은 덜 빈번한 업데이트

 

장단점 ) 

 

 

결론 )) 

  • 기본적으로는 @Version을 사용하는 낙관적 락을 먼저 고려하는 것이 일반적
  • 하지만 실제 운영하면서 충돌이 너무 많이 발생하면 비관적 락으로 전환
  • 즉, "낙관적 락을 기본으로 사용하고, 필요하면 비관적 락을 적용"하는 것이 일반적인 전략

👉 실제 프로젝트에서도 기본적으로 낙관적 락을 사용하고, 충돌이 많아지면 비관적 락으로 바꾸는 경우가 많다!

'TIL' 카테고리의 다른 글

sql injection / XSS 예방법  (0) 2025.03.19
spring servlet 정리.  (1) 2025.03.17
ec2 내 서버 무중단으로 실행시키기  (0) 2025.03.16
GitHub action SSH key 발급  (0) 2025.03.15
NginX 설정 https 요청시 주의점  (0) 2025.03.14