낙관적 락 vs 비관적 락, 무엇이 다를까

동시성 제어가 필요한 이유

여러 사용자가 같은 데이터를 동시에 수정하려고 하면 문제가 생긴다. 예를 들어 재고가 1개 남은 상품을 두 명이 동시에 주문하면, 둘 다 주문에 성공해서 재고가 -1이 되는 상황이 발생할 수 있다. 이런 데이터 정합성 문제를 막기 위해 사용하는 대표적인 방법이 바로 낙관적 락과 비관적 락이다.

비관적 락: 일단 잠그고 시작한다

비관적 락은 ‘누군가 데이터를 건드릴 것’이라고 가정하고, 데이터를 읽는 순간부터 락을 걸어버리는 방식이다. 도서관에서 책을 빌릴 때 아예 서가에서 책을 빼서 대출대에 올려놓는 것과 비슷하다. 다른 사람은 그 책이 반납(트랜잭션 종료)되기 전까지는 아예 접근조차 할 수 없다.

데이터베이스에서는 SELECT ... FOR UPDATE 같은 구문으로 구현한다. 트랜잭션이 특정 로우를 조회하면서 락을 걸고, 다른 트랜잭션은 그 로우에 대한 수정이 끝날 때까지 대기하게 된다.

  • 장점: 충돌이 잦은 환경에서 데이터 정합성을 확실하게 보장한다.
  • 단점: 락을 기다리는 시간이 늘어나

댓글 남기기