리타의 저장소

트랜잭션 동시성 처리 #2 (feat. 오라클 vs MySQL vs PostgreSQL) 본문

Dev/Backend

트랜잭션 동시성 처리 #2 (feat. 오라클 vs MySQL vs PostgreSQL)

ريتا 2026. 4. 3. 22:50

MVCC란?

다중 버전 동시성 제어

하나의 데이터를 여러 트랜잭션이 동시에 읽고 쓸 수 있게 하되, 충돌 없이 일관성을 유지하도록 하는 기술

동시성 제어

데이터베이스에서 여러 트랜잭션이 동시에 실행될 때, 데이터의 일관성과 무결성을 보장하기 위한 제어 메커니즘

  • 요약
    • 동시성 제어는 트랜잭션 간의 충돌을 방지하고, 무결성을 지키기 위한 핵심 기술.
    • 비관적 제어(Pessimistic): 락 기반, 충돌 방지, 안전하지만 성능 손해
    • 낙관적 제어(Optimistic): 버전 기반, 충돌 허용 후 감지, 성능 좋지만 충돌 시 리스크
    • 공유락(S-Lock): 여러 트랜잭션이 읽기만 가능
    • 배타락(X-Lock): 하나의 트랜잭션만 읽기/쓰기 가능

 

다중 버전 동시성 제어가 무엇인지 확인해보기 이전에 우선 동시성 제어가 무엇인지 확인해보자.

 

동시성 제어란 DBMS가 다수의 사용자 사이에서 동시에 작용하는 다중 트랜잭션의 상호간섭 작용에서 DB를 보호하는 것을 의미한다.

 

MVCC는 동시 접근을 허용하는 데이터베이스에서 동시성을 제어하기 위해 사용하는 방법 중 하나이다.

원본의 데이터와 변경중인 데이터를 동시에 유지하는 방식으로, 원본 데이터에 대한 Snapshot을 백업해서 보관한다. 만일 두 버전의 데이터가 존재하는 상황에서 새로운 사용자가 데이터에 접근을 한다면, 데이터베이스의 Snapshot을 읽는다. 그러다가 변경이 취소 되면 원본 Snapshot을 바탕으로 데이터를 복구하고, 만약 변경이 완료되면 최종적으로 디스크에 반영하는 방식으로 동작.

그러니까, Snapshot을 활용하는 방식이 MVCC이다. 하나의 데이터에 대하여 여러 버전의 데이터가 존재하고, 사용자는 마지막 버전의 데이터를 읽게 되는 것.

 

MVCC의 접근 방식은 잠금을 필요로 하지 않기 때문에 일반적인 RDBMS보다 매우 빠르게 작동한다. 또한, 데이터를 읽기 시작할 때, 다른 사람이 그 데이터를 삭제하거나 수정한다하더라도 영향을 받지 않고 데이터를 사용할 수 있다. 다만, 사용하지 않는 데이터가 계속 쌓이게 되므로 데이터를 정리하는 시스템이 필요하다. MVCC모델은 하나의 데이터에 대한 여러 버전의 데이터를 허용하기 때문에, 데이터 버전이 충돌될 수 있고, 이런 경우엔 어플리케이션 영역에서 이를 해결해야만 한다.

 

📌 핵심 개념

  • "읽기 전용 트랜잭션은 락을 걸지 않는다"
  • 트랜잭션은 데이터의 스냅샷(버전)을 보고 읽는다.
  • 쓰기 작업이 있을 경우, 새로운 버전의 데이터를 생성한다.
  • 따라서 읽기와 쓰기 트랜잭션이 서로 블로킹(blocking) 없이 공존할 수 있다