포스트

MVCC를 어떻게 이해해야 하는가

MVCC란

MVCC는 Multi-Version Concurrency Control의 약자다. 말 그대로 하나의 데이터에 대해 여러 버전을 관리해서, 읽기와 쓰기가 서로 덜 충돌하게 만드는 방식이다.

핵심은 “읽는 쪽이 항상 최신 데이터를 직접 보는 것이 아니라, 자신에게 허용된 시점의 버전을 본다”는 점이다.

왜 필요한가

동시성이 높은 시스템에서 읽기와 쓰기가 서로 계속 막기 시작하면 처리량이 급격히 떨어진다. MVCC는 읽기 작업이 과거 스냅샷을 보게 해서 락 경쟁을 줄인다.

그래서 “쓰기 중인데도 읽기가 되는” 경험은 대부분 MVCC 덕분이다.

어떻게 동작하나

구현은 DB마다 다르지만, InnoDB 기준으로는 다음 흐름으로 이해하면 된다.

  • 레코드 변경 전 버전을 undo log에 남김
  • 트랜잭션은 자신이 볼 수 있는 버전을 판별함
  • 읽기 시점에는 적절한 버전을 선택해 반환

즉, 하나의 row를 덮어쓰는 것이 아니라 “현재 버전”과 “이전 버전” 정보가 함께 관리된다.

snapshot read와 current read

Snapshot Read

일반 SELECT처럼 스냅샷을 읽는다. 락 없이 과거 일관된 시점의 데이터를 보는 데 초점이 있다.

Current Read

SELECT ... FOR UPDATE, UPDATE, DELETE처럼 현재 최신 버전과 락을 기준으로 읽는다.

MVCC를 이해할 때 이 둘을 구분하지 않으면 왜 어떤 쿼리는 막히고 어떤 쿼리는 안 막히는지 설명이 안 된다.

장점

  • 읽기와 쓰기 충돌 감소
  • 높은 동시성
  • 일관된 읽기 제공

한계

  • 쓰기 충돌 자체를 없애는 것은 아님
  • undo 관리 비용이 존재
  • 격리 수준에 따라 여전히 팬텀/락 문제가 중요함

정리

MVCC는 “락을 안 쓴다”가 아니라, “읽기를 버전 기반으로 처리해서 불필요한 락 경쟁을 줄인다”에 가깝다. 트랜잭션과 격리 수준을 이해할 때 MVCC는 가장 먼저 붙잡아야 할 개념 중 하나다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.

댓글

아직 댓글이 없습니다