비관적 락 vs 낙관적 락

김키핑·2026년 9월 26일
post-thumbnail

Q1 풀이를 위해서는 동시성 문제와 비관적 락, 낙관적 락 개념을 알아야 할 것으로 보인다.


동시성 문제

여러 사용자가 동시에 같은 데이터를 수정하려 할 때 발생하는 충돌 상황.
여러 실행 흐름(스레드, 프로세스, 트랜잭션 등)이 공유 자원에 동시에 접근하면서 데이터 불일치가 발생하여 문제가 발생한다.


해결전략

비관적 락

비관적 락은 여러 트랜잭션이 같은 데이터에 동시에 접근하면 충돌이 발생할 것이라고 미리 가정하고, 먼저 접근한 트랜잭션이 데이터에 락을 걸어 다른 트랜잭션의 접근을 막는 방식이다.

이 방식은 데이터에 접근하기 전에 먼저 락을 걸고, 락이 해제될 때까지 다른 트랜잭션은 해당 데이터에 접근하지 못하고 기다려야 한다.

  • 장점 : 충돌 없이 안전하게 데이터를 처리할 수 있다.
  • 단점 : 한 번에 한 트랜잭션만 처리할 수 있어 다른 트랜잭션은 락이 풀릴 때까지 기다려야 하므로, 요청이 많아질수록 처리 속도가 느려진다.


낙관적 락

낙관적 락은 동시 접근 시 충돌이 발생하지 않을 것이라고 가정하고, 작업 완료 후 충돌 여부를 확인하는 방식이다.

이 방식은 데이터를 수정할 때 락을 걸지 않고 저장 시점에 버전을 조건으로 확인하여, 그 사이 버전이 바뀌어 업데이트된 행이 0건이면 충돌로 판단해 재시도하거나 실패 처리한다.

  • 장점 : 락을 걸지 않아 다른 트랜잭션이 기다릴 필요가 없으므로, 충돌이 드문 환경에서는 빠르게 처리할 수 있다.
  • 단점 : 충돌이 발생하면 업데이트가 실패해 재시도해야 하므로, 충돌이 잦을수록 재시도가 반복되어 오히려 처리 속도가 느려진다.
구분낙관적 락비관적 락
락 사용XO
성능OX
안전성XO

※ 락사용 : 데이터를 수정하기 전에 잠금을 거는가
※ 성능 : 기다림 없이 빠르게 처리할 수 있는가
※ 안전성 : 충돌을 미리 막아 실패 없이 처리되는가


비교 및 선택 기준

동시성 제어는 성능과 속도 사이의 트레이드오프

유감스럽게도 동시성 제어에서 정합성과 성능을 모두 챙기는 방법은 없다.
개발하는 프로그램의 특성에 따라 정합성과 성능 중 무엇이 더 중요한지 판단하고, 그에 맞는 방법을 선택하자.


비관적 락을 선택할 때

  • 데이터 정합성이 매우 중요한 경우
  • 같은 데이터에 충돌이 자주 발생하는 경우
  • 충돌 시 실패·재시도 비용이 큰 경우
  • 트랜잭션이 짧게 끝나 락을 오래 잡지 않는 경우
  • 재시도 로직을 구현하기 어려운 경우

낙관적 락을 선택할 때

  • 성능과 처리량이 중요한 경우
  • 같은 데이터에 충돌이 드물게 발생하는 경우
  • 읽기가 많고 수정이 적은 경우
  • 조회 후 수정까지 시간이 오래 걸리는 경우
  • 충돌 시 재시도해도 문제가 없는 경우

예시

비관적 락 예시

티켓팅 사이트. 큐스토 귀엽다

여러 사람이 동시에 같은 좌석을 선택하면, 비관적 락으로 한 명만 선점에 성공하고 나머지는 "이미 선택된 좌석입니다" 안내를 받아 결제 진행이 불가능함.


낙관적 락 예시

나무위키에는 동시수정 이라는 기능이 있다.

여러 사람이 동시에 같은 문서 저장을 시도하면, 낙관적 락으로 먼저 저장한 사람의 수정만 반영되고, 나머지 사람은 "편집 충돌" 안내를 받아 최신 내용을 확인한 뒤 다시 저장해야 한다.

profile
양치기소녀

0개의 댓글