MVCC

Q·2025년 12월 19일

RDBMS

목록 보기
10/11

1. MVCC란 무엇인가?

과거의 데이터베이스는 동시성을 제어하기 위해 강력한 락(Lock)을 사용했습니다.

  • "누가 데이터를 읽고 있으면, 수정하지 마!" (Shared Lock)
  • "누가 데이터를 수정하고 있으면, 읽지도 마!" (Exclusive Lock)

하지만 이렇게 하면 대기 시간이 길어져 성능이 떨어집니다. 이를 해결하기 위해 나온 것이 MVCC입니다.

MVCC의 핵심 아이디어:

"데이터를 덮어쓰지 말고, 새로운 버전을 하나 더 만들자!"

즉, 데이터에 변경이 일어날 때 기존 데이터를 지우는 것이 아니라 새로운 버전(Snapshot)을 생성하여 관리합니다.

2. MVCC의 동작 원리 (Lock Free Read)

MVCC 모델에서 가장 중요한 원칙은 "읽기 작업(Reader)은 쓰기 작업(Writer)을 방해하지 않고, 쓰기 작업도 읽기 작업을 방해하지 않는다"는 것입니다.

읽기 (SELECT):

  • 별도의 락(Lock)을 걸지 않습니다.
  • 대신, 트랜잭션이 시작된 시점의 과거 데이터 버전(Snapshot)을 읽습니다.
  • 누군가 데이터를 수정 중이라도, 나는 수정 전의 데이터를 읽으면 되므로 대기하지 않습니다.

쓰기 (UPDATE / DELETE):

  • 데이터를 수정할 때, 해당 행(Row)에 배타적 락(Exclusive Lock)을 겁니다. (동시에 두 명이 같은 값을 수정할 순 없으니까요.)
  • 기존 데이터를 덮어쓰는 게 아니라, 수정된 새로운 버전을 생성하거나, 기존 데이터를 'Undo Log(실행 취소 로그)'라는 곳에 복사해둡니다.

3. 예시로 보는 동작 과정

상황: ID=1인 유저의 나이가 20살입니다.

  1. 트랜잭션 A (읽기): 오후 1시에 조회를 시작합니다. (이때 나이는 20살)

  2. 트랜잭션 B (쓰기): 오후 1시 1분에 나이를 21살로 UPDATE 하고 아직 커밋(Commit)은 안 했습니다.

    • 이때 DB 내부에는 20살(구버전)과 21살(신버전)이 공존합니다.
    • 트랜잭션 B는 해당 행에 락(Lock)을 겁니다.
  3. 트랜잭션 A (다시 읽기): 오후 1시 2분에 다시 조회를 합니다.

    • 락 기반 방식이라면: B가 락을 걸었으므로 A는 B가 끝날 때까지 기다려야 합니다.
    • MVCC 방식이라면: A는 기다리지 않고, 자신이 처음 시작했던 시점의 데이터인 20살(Undo Log에 있는 구버전)을 읽습니다.

4. MVCC에서의 락(Lock) 모델 정리

MVCC라고 해서 락을 아예 안 쓰는 것은 아닙니다. "읽기에는 락을 안 쓰고, 쓰기에는 락을 쓴다"가 정확합니다.

구분설명락 사용 여부
일반 읽기(Consistent Read),SELECT * FROM ...Lock 없음 (X) 특정 시점의 스냅샷(버전)을 읽음. 가장 빠름.
잠금 읽기(Locking Read),SELECT ... FOR UPDATELock 사용 (O) 데이터를 수정할 의도로 읽는 것이므로 최신 버전을 읽고 락을 걺.
쓰기(Write),"INSERT, UPDATE, DELETE"Lock 사용 (O) 데이터 정합성을 위해 해당 행(Row)에 락을 걺.
profile
Data Engineer

0개의 댓글