본문 바로가기
Dev/Computer Science

[CS] 낙관적 락, 비관적 락 - 동시성 제어 주요기법

by 컴포넌트설계자 2025. 8. 20.

낙관적 락(Optimistic Lock)비관적 락(Pessimistic Lock)은 데이터베이스 트랜잭션에서 동시성 제어를 위해 사용되는 대표적인 기법 여러 트랜잭션이 동시에 동일한 데이터에 접근할 때 발생할 수 있는 충돌을 방지하고 데이터 무결성을 보장하는 것이 목적

🔹 낙관적 락 (Optimistic Lock)

  • 가정: 데이터 충돌이 자주 발생하지 않는다.
  • 데이터를 읽을 때는 락을 걸지 않고 자유롭게 접근한다.
  • 트랜잭션이 데이터를 수정하려 할 때, 버전(version) 컬럼이나 타임스탬프 등을 비교해 다른 트랜잭션이 해당 데이터를 변경했는지 확인한다.
  • 만약 충돌이 감지되면, 데이터베이스가 아닌 애플리케이션 단에서 롤백하거나 재시도 처리를 수행한다.
  • 장점: 락으로 인한 자원 점유가 적어 성능이 우수하다.
  • 단점: 충돌 발생 시 재시도 비용이 크다.

🔹 비관적 락 (Pessimistic Lock)

  • 가정: 데이터 충돌이 빈번하게 발생한다.
  • 트랜잭션이 데이터를 읽거나 수정할 때 즉시 락을 설정한다.
    • 공유 락(Shared Lock, S-Lock): 읽기 작업 시 다른 읽기는 허용하지만, 쓰기는 차단한다.
    • 베타 락(Exclusive Lock, X-Lock): 쓰기 작업 시 다른 모든 접근(읽기/쓰기)을 차단한다.
  • 다른 트랜잭션은 해당 데이터에 접근할 수 없으므로 충돌을 원천적으로 방지한다.
  • 장점: 충돌이 거의 발생하지 않는다.
  • 단점: 락 점유로 인해 동시성 처리 성능이 떨어지고, 데드락이 발생할 수 있다.

👉 정리하면,

  • 낙관적 락은 충돌이 적은 환경에서 성능 최적화에 유리하고,
  • 비관적 락은 충돌이 많은 환경에서 데이터 안정성을 보장하는 데 적합

S-Lock과 X-Lock은 다음과 같습니다.

S-Lock: 다른 트랜잭션에서 읽기는 가능하지만 쓰기는 불가능합니다.
X-Lock: 다른 트랜잭션에서 읽기, 쓰기 모두 불가능합니다.
    cf. MySQL은 일관된 읽기(Consistent Nonlocking Reads)를 지원하여 X-Lock이 걸려있어도 단순 SELECT로 읽을 수 있습니다.

두 방식의 차이점?

구분 낙관적 락 (Optimistic Lock) 비관적 락 (Pessimistic Lock)

가정 충돌이 적을 것이라 가정 충돌이 많을 것이라 가정
락 사용 여부 DB 락을 걸지 않음 트랜잭션 시작 시 DB 락 설정
처리 방식 충돌 시 버전 체크 후 롤백·재시도 충돌 자체를 차단 (대기 발생)
성능 락이 없어 빠르지만 충돌 시 성능 저하 가능 안정적이지만 동시성 처리 성능 저하
사용 사례 읽기 위주, 충돌이 드문 환경 쓰기/갱신이 빈번하고 충돌 가능성이 높은 환경

요약 

낙관적 락은 충돌이 적을 것으로 가정하고 데이터를 수정할 때만 충돌 여부를 확인하는 방식으로, 성능에 유리하지만 충돌 시 재시도 비용이 발생합니다. 반면, 비관적 락은 충돌이 잦을 것으로 가정하고 트랜잭션 시작 시점에 락을 걸어 다른 접근을 차단하는 방식으로, 안정성은 높지만 동시성 처리 성능이 떨어질 수 있습니다. 따라서 환경에 따라 성능 중심이면 낙관적 락, 안정성 중심이면 비관적 락이 적합합니다.

 

출처 : 매일매일