DB

MVCC

국자집사 2024. 12. 27. 17:28

[ 목차 ]

    동시성 제어와 락 메커니즘

    데이터베이스 시스템에서 동시성 제어는 다중 트랜잭션 환경에서 데이터 일관성과 무결성을 보장하기 위해 필수적이다. 

    락 메커니즘 요약

    • 공유락(Shared Lock): 데이터를 읽는 동안 쓰기를 방지.
    • 배타락(Exclusive Lock): 데이터를 읽거나 쓸 때 다른 트랜잭션의 접근을 완전히 차단.
    • 갭 락(Gap Lock): Phantom Read 방지를 위해 레코드 사이의 간격에 락을 설정.
    • 넥스트 키 락(Next-Key Lock): 갭 락과 레코드 락을 결합하여 동시성을 제어.

    락 메커니즘의 한계

    1. 락 경쟁(Lock Contention): 다수의 트랜잭션이 동일 데이터에 락을 요청하면 대기 시간이 증가.
    2. 데드락(Deadlock): 트랜잭션 간 교착 상태로 인해 작업이 진행되지 않음.
    3. 성능 저하: 락을 걸고 해제하는 데 소요되는 비용으로 인해 동시성이 제한됨.

    - 락 메커니즘은 데이터 충돌 방지와 동시성 관리에서 중요한 역할을 하지만, 성능 저하와 데드락 같은 한계점이 있다. 특히, 다중 트랜잭션이 동일 데이터에 접근할 경우 락 경쟁이 발생하며, 이는 대기 시간 증가와 시스템 병목 현상을 초래한다.

    이러한 한계를 해결하고 읽기 작업과 쓰기 작업의 충돌을 최소화하기 위해 MVCC(Multi-Version Concurrency Control)가 등장했다. 

     

    락 메커니즘의 자세한 설명은 아래 포스팅 참고 ↓ ↓ ↓

    https://rnrwk0502.tistory.com/53

     

    트랜잭션 격리 수준 & 동시성 제어

    [ 목차 ] 트랜잭션 격리 수준(Transaction Isolation Level)- 트랜잭션의 격리 수준이란 여러 트랜잭션이 동시에 처리될 때, 특정 트랜잭션이 다른 트랜잭션에서 변경하거나 조회화는 데이터를 볼 수 있

    rnrwk0502.tistory.com

     


     

    MVCC(Multi-Version Concurrency Control)

    MVCC의 정의

    • MVCC는 데이터베이스에서 동일 데이터에 대해 여러 버전을 유지함으로써 락 없이 동시성을 관리하는 기법이다.
    • 트랜잭션이 데이터를 읽을 때 해당 시점의 스냅샷(Snapshot)을 제공하여, 읽기 작업과 쓰기 작업이 충돌하지 않도록 한다.

    MVCC의 원리와 구성 요소

    1. Undo Log
      • 트랜잭션 실행 이전 상태를 기록하여 롤백이나 MVCC를 구현.
      • 이전 데이터를 참조할 수 있도록 데이터 변경 내용을 저장.
      • 예시: 사용자 A가 트랜잭션에서 특정 데이터를 수정하려 할 때, Undo Log에 원래 데이터를 기록해 두어 롤백이나 다른 트랜잭션에서 이를 참조할 수 있게 한다.
    2. Redo Log
      • 트랜잭션이 커밋된 후 장애 복구 시 변경 내용을 재적용.
      • 데이터 무결성과 지속성을 보장.
      • 예시: 시스템 장애가 발생한 경우, Redo Log를 참조하여 마지막 커밋된 변경 사항을 복원한다.
    3. 버퍼풀(Buffer Pool)
      • 메모리 내 데이터를 관리하여 디스크 I/O를 줄이고 성능을 높임.
      • Undo Log와 Redo Log의 동작을 가속화.
      • 예시: 데이터베이스의 빈번한 읽기/쓰기 작업이 버퍼풀에서 처리되어 디스크 접근을 최소화한다.

    이러한 요소들은 함께 동작하여 트랜잭션 격리와 데이터 무결성을 보장한다.

    예를 들어, 사용자가 데이터를 읽을 때 Undo Log를 통해 이전 버전을 참조하여 읽기 일관성을 유지하며, 트랜잭션이 종료되면 Redo Log와 버퍼풀이 협력하여 데이터를 지속적으로 저장하고 복구를 지원한다.

     

     

    MVCC의 작동 방식

    1. 스냅샷 읽기(Snapshot Read):
      • 트랜잭션 시작 시점의 데이터 버전을 읽어들임.
      • 다른 트랜잭션의 변경 작업은 현재 트랜잭션에 영향을 미치지 않음.
    2. 쓰기 작업:
      • 기존 데이터를 수정하지 않고 새로운 버전을 생성.
      • 커밋되지 않은 쓰기 작업은 다른 트랜잭션에서 볼 수 없음.
    3. 가비지 수집(Garbage Collection):
      • 참조되지 않는 오래된 데이터 버전을 주기적으로 삭제.

     

    MVCC의 장단점

    • 장점:
      • 읽기 작업과 쓰기 작업 간 충돌 최소화.
      • 락 경합이 없어 높은 동시성 제공.
      • Dirty Read, Non-Repeatable Read 문제 해결.
    • 단점:
      • 추가 저장 공간이 필요하며, 데이터 버전 관리의 복잡성이 증가.
      • Phantom Read 방지는 Serializable 수준에서만 가능.

     

    MVCC에서 발생할 수 있는 문제

    1. Snapshot Anomaly (스냅샷 이상현상):
      • 문제: 트랜잭션이 오래된 스냅샷을 참조하여 최신 데이터와 불일치가 발생할 수 있다.
      • 해결 방법: 더 높은 격리 수준(예: Serializable)을 사용하거나, 애플리케이션 레벨에서 데이터 동기화를 처리한다.
    2. 가비지 데이터 증가:
      • 문제: MVCC는 여러 데이터 버전을 유지하므로, 참조되지 않는 오래된 데이터가 쌓여 디스크 공간을 낭비하고 성능을 저하시킬 수 있다.
      • 해결 방법: 데이터베이스의 가비지 수집(Garbage Collection) 메커니즘을 활용하여 주기적으로 사용되지 않는 데이터 버전을 삭제한다. PostgreSQL의 VACUUM이나 MySQL InnoDB의 Purge Thread를 예로 들 수 있다.
    3. Lost Update 문제:
      • 문제: 두 트랜잭션이 동시에 동일 데이터를 업데이트하면 변경 사항이 일부 손실될 수 있다.
      • 해결 방법: 애플리케이션 레벨에서 낙관적 락(Optimistic Lock) 또는 **비관적 락(Pessimistic Lock)**을 활용하여 충돌을 감지하고 처리한다. MySQL에서는 Repeatable Read 격리 수준에서 이 문제를 예방한다.

     


     

    MVCC의 데이터베이스별 구현

    PostgreSQL에서의 MVCC

    • PostgreSQL은 트랜잭션마다 Undo Log 없이 데이터 버전을 관리한다.
    • 데이터 버전 관리:
      • 각 트랜잭션이 데이터의 변경 사항을 독립적으로 기록.
      • 커밋되지 않은 데이터는 다른 트랜잭션에서 보이지 않음.
    • Lost Update 문제 해결:
      • 트랜잭션 종료 시점에 충돌 여부를 검증하여 문제를 방지.
    • 가비지 데이터 관리:
      • VACUUM 명령어를 통해 오래된 데이터 버전을 주기적으로 삭제하여 디스크 공간을 확보.

    MySQL에서의 MVCC

    • MySQL InnoDB는 Undo Log를 사용하여 MVCC를 구현.
    • 데이터 버전 관리:
      • Undo Log를 참조하여 이전 데이터 버전을 유지.
      • 새로운 데이터 버전은 쓰기 작업 시 생성되며, 커밋 전까지 다른 트랜잭션에서 접근 불가.
    • Lost Update 문제 해결:
      • 트랜잭션 시작 시점에 데이터 버전을 비교하여 충돌 여부를 감지.
    • 가비지 데이터 관리:
      • Purge Thread를 통해 불필요한 Undo Log를 정리하여 성능 최적화.

     

    Oracle에서의 MVCC

    • Oracle Database는 Rollback Segment를 활용하여 MVCC를 구현.
    • 데이터 버전 관리:
      • Rollback Segment를 사용해 트랜잭션의 이전 데이터를 기록.
      • 커밋되지 않은 데이터는 다른 트랜잭션에서 접근 불가.
    • 가비지 데이터 관리:
      • 자동화된 가비지 수집 프로세스를 통해 사용되지 않는 Rollback Segment를 정리.
    • Undo Log와의 차이점:
      • Rollback Segment는 Oracle에서 전용 공간에 데이터 변경 내역을 기록하며, 트랜잭션별로 정리되지 않은 이전 데이터를 관리한다.
      • MySQL의 Undo Log는 데이터 변경 사항을 기록하여 이전 버전을 관리하고, Purge Thread를 통해 불필요한 로그를 정리하는 방식으로 동작한다.
    • 특징:
      • 높은 격리 수준에서 안정적으로 작동하며, 대규모 트랜잭션 환경에서도 데이터 무결성을 보장.


    MVCC와 락 메커니즘의 비교

    특징 MVCC 락 메커니즘
    충돌 관리 데이터 버전을 유지하여 충돌 최소화 락을 통해 충돌 방지
    성능 읽기 작업이 많은 환경에서 우수 쓰기 작업이 많은 환경에서 데이터 무결성 보장
    주요 사용 사례 읽기 위주의 트랜잭션 처리 시스템 (SNS, 분석 플랫폼) 쓰기 작업이 많은 트랜잭션 시스템 (은행, 재고 관리)

     

     


     

    출처

    https://retto9522.tistory.com/60

     

    [DB]MVCC(Multi-Version Concurrency Control), 동시성 제어란?

    동시성 제어(Concurrency Control)동시성 제어란?동시성 제어란 DBMS가 다수의 사용자 사이에서 동시에 작용하는 다중 트랜잭션의 상호간섭 작용에서 데이터베이스를 보호하는 것을 의미합니다. 일반

    retto9522.tistory.com

     

    https://monday9pm.com/mvcc-multi-version-concurrency-control-%EC%95%8C%EC%95%84%EB%B3%B4%EA%B8%B0-e4102cd97e59

     

    MVCC(Multi Version Concurrency Control) 알아보기

    TL;DR

    monday9pm.com

    https://beomsic.tistory.com/entry/MVCC

     

    MVCC

    동시성 제어 (Concurrency Control) ❓동시성 제어 ❗DBMS가 다수의 사용자 사이에서 동시에 작용하는 다중 트랜잭션의 상호간섭 작용에서 DB를 보호하는 것. 동시성을 허용하면 일관성이 낮아진다. 비

    beomsic.tistory.com

    https://mangkyu.tistory.com/288

     

    [MySQL] MVCC(다중 버전 동시성 제어)와 데이터베이스가 트랜잭션을 지원하는 방법과 동작 과정

    이번에는 데이터베이스가 트랜잭션을 지원하는 방법과 동작 과정에 대해 살펴보도록 하겠습니다. 아래의 내용은 RealMySQL과 MySQL 공식 문서 등을 참고하여 작성한 내용입니다.    1. MVCC(다중 버

    mangkyu.tistory.com

     

    'DB' 카테고리의 다른 글

    트랜잭션 격리 수준 & 동시성 제어  (0) 2024.12.26
    트랜잭션 / ACID  (0) 2024.12.26
    클러스터링 / 레플리케이션  (2) 2024.12.06
    정규화 / 반정규화  (0) 2024.11.28
    DB 인덱스  (1) 2024.11.09