MVCC

22·2023년 12월 12일

MySQL

목록 보기
1/2

Multi Version Concurrency Control

  • 여기서 Multi Version 은 하나의 레코드에 대해 여러 개의 버전이 동시에 관리된다는 의미이다.
  • MVCC 는 레코드 레벨의 트랜잭션을 지원하는 DBMS 가 제공하는 기능이고, 가장 큰 목적은 잠금을 사용하지 않는 일관된 읽기를 제공하는 것이다.
  • MySql 의 Inno DB 는 undo log 를 이용해 repetable read 를 구현한다.

동작방법 (MySQL)

  • Isolation level 이 Read_Committed 인 경우
    update member set firtst_name = '김' where id=1;
  • update 전에 first_name 이 '박'이라면 '박' 이 mysql 메모리의 undo log 에 복사된다.
  • commit 여부와 관계없이 Inno DB 의 버퍼풀은 새로운 값인 '김'으로 update 된다.

Q. 이 상황에서 commit or rollback 전, 다른 사용자가 select * from member where id=1 을 요청하면 어디에 있는 데이터를 조회할까?
A. MySQL 서버의 isolation 시스템 변수에 따라 다르다.

  • read_uncommitted 라면 InnoDB 버퍼 풀이나 데이터 파일로부터 변경되지 않은 데이터를 읽는다. read_commited 이상에서는 undo 영역의 데이터를 반환한다.

이처럼 MVCC 는 하나의 레코드에 대해 2개의 버전이 유지되고, 필요에 따라 어느 데이터가 보여지는지 달라지는 구조다.

Q. undo 영역은 언제 제거가 될까?
A. 데이터가 commit 이 됐다고 undo 영역의 백업 데이터가 바로 삭제되는 것은 아니다. undo 영역을 필요로 하는 트랜잭션이 더는 없을 때 비로소 삭제된다.

  • 예를 들면, 위에 id 가 1인 row 의 update 가 commit 이 됐다. 그랬다고 undo 영역에 id 가 1인 '김' 이 바로 제거되지 않는다. 다른 트랜잭션이 repetable read 레벨에서 undo 영역의 '김'을 조회하고 있을 수 있기 때문이다.

트랜잭션이 길어지면 안되는 이유

  • 예전 버전의 데이터는 무한히 많아질 수 있어, undo 영역에 저장되는 공간이 많아질 수 있다. 트랜잭션이 길어지면 undo 에서 관리하는 예전 데이터가 삭제되지 못하고 오랫동안 관리돼야 하고, 저장 공간이 많이 증가되기 때문이다.

MVCC 장단점

장점

  • 증가된 동시성 : MVCC는 데이터에 대한 깨끗한 스냅샷을 제공하여 여러 트랜잭션이 동시에 실행될 수 있도록 합니다. 이는 락 경합을 감소시켜 트랜잭션이 불필요하게 차단되는 것을 방지한다.

  • 최적화된 성능 : 명시적인 락이 필요하지 않기 때문에 MVCC는 빠른 읽기 및 쓰기 작업이 가능하다. 특히 높은 동시성 환경에서 성능이 최적화된다.

  • 향상된 격리 : MVCC는 각 트랜잭션의 시작 시간에 맞춰진 스냅샷을 제공함으로써 동시에 실행되는 트랜잭션 간에 격리를 제공한다. 이는 트랜잭션이 독립적으로 작동하고 일관되게 데이터를 다룰 수 있도록 한다.

단점

  • 증가된 저장 공간 사용량 : MVCC는 각 레코드의 여러 버전을 유지해야 하므로 저장 공간 사용량이 증가할 수 있다. 그러나 이 오버헤드는 저장 및 가비지 컬렉션 메커니즘을 최적화함으로써 수용 가능한 수준으로 감소시킬 수 있다.

  • 복잡한 가비지 컬렉션 : MVCC가 생성한 레코드 버전을 관리하기 위해 정교한 가비지 컬렉션 메커니즘이 필요하다. 이로 인해 데이터베이스 시스템에서 특히 높은 트랜잭션 환경에서 일부 복잡성이 발생할 수 있다.

  • 특정 상황에서 일관성 보장 감소 : MVCC는 특정 상황에서 일관성 보장이 감소할 수 있다. 이러한 상황은 일반적으로 읽기-쓰기 충돌이나 데이터베이스 시스템이 read-committed 및 read-uncommitted와 같은 덜 강력한 일관성 보장을 제공하는 isolation level 을 사용하는 경우에 발생할 수 있다. 그러나 이는 일반적으로 MVCC의 다양한 이점을 고려할 때 허용할 수 있는 트레이드오프 이다. (상황에 따라 isolation level 을 잘 설정해야한다.)

참고

Real MySQL 8.0 1
https://appmaster.io/blog/mvcc-in-relational-databases

0개의 댓글