MVCC는 각 트랜잭션에서 일어나는 읽기와 쓰기 연산을 다른 트랜잭션의 영향을 받지 않고 실행할 수 있도록 해주며, 트랜잭션들이 동시에 데이터베이스에 접근하여 변경 작업을 수행할 때 발생할 수 있는 문제를 해결합니다.

MVCC가 데이터베이스에서 데이터를 읽을 때 해당 데이터의 버전(혹은 스냅샷)을 생성하여 이 버전을 기반으로 읽기 연산을 수행합니다. 쓰기 연산을 수행할 때는 새로운 버전을 생성하고, 새 버전에 대한 포인터를 이전 버전에 대한 포인터와 함께 저장합니다. 이를 통해 새로운 버전이 생성되어도 이전 버전을 이용하여 읽기 연산을 수행할 수 있습니다.

MVCC는 각 트랜잭션의 시작 시점에 트랜잭션 ID와 해당 시점의 스냅샷 버전이 할당됩니다. 이후 읽기 연산이 수행될 때는 트랜잭션 ID와 스냅샷 버전을 기반으로 데이터를 읽습니다. 만약 해당 데이터의 버전이 현재 트랜잭션의 스냅샷 버전보다 더 최신 버전이라면, 이 데이터는 다른 트랜잭션에 의해 변경된 데이터이므로 해당 트랜잭션은 롤백됩니다. 이와 같은 방식으로 MVCC는 트랜잭션의 격리성(isolation)을 보장합니다.

MVCC는 대부분의 상황에서 우수한 성능을 보입니다. 하지만, 데이터베이스에서 데이터의 변경 빈도가 매우 높거나, 데이터를 업데이트하는 트랜잭션이 많은 경우에는 MVCC의 성능이 저하될 수 있습니다. 또한 MVCC는 각 트랜잭션의 시작 시점에 스냅샷을 생성하는데, 이 때문에 스냅샷 생성에 대한 오버헤드가 발생할 수 있습니다.

MVCC의 장점

  1. 동시성: MVCC는 여러 사용자가 데이터를 동시에 액세스할 수 있도록 하면서 데이터의 일관성과 무결성을 보장합니다.
  2. 격리 수준: MVCC는 데이터베이스의 격리 수준을 유지하면서 동시성 문제를 해결합니다.
  3. 공간 효율성: MVCC는 복사본을 만들어 현재 버전의 데이터를 변경합니다. 이전 버전의 데이터는 남아 있지만, 필요할 때만 액세스할 수 있으므로 공간 효율적입니다.
  4. 성능: MVCC는 데이터를 읽을 때 락을 걸지 않기 때문에 성능이 향상됩니다. 또한 복사본을 만드는 것이 추가 오버헤드를 일으킬 수 있지만, 일반적으로 복사본을 만드는 것은 상대적으로 저렴합니다.

MVCC는 다중 사용자 데이터베이스 환경에서 동시성 문제를 해결하는 데 매우 효과적인 방법입니다.

MVCC의 단점

  1. 더 많은 저장 공간이 필요하다: MVCC는 매번 새로운 버전을 생성하기 때문에, 데이터베이스 저장 공간이 더 많이 필요하게 됩니다. 또한, 각 버전은 이전 버전과 연결되어 있으므로 불필요한 데이터의 중복이 발생할 수 있습니다.
  2. 인덱스의 복잡성 증가: MVCC를 구현하는 데는 인덱스가 필요합니다. 이 인덱스는 레코드의 버전 정보를 저장해야 하므로 인덱스의 복잡성이 증가합니다.
  3. 롤백 비용 증가: 롤백은 이전 버전으로 복구되는 것이므로, 롤백이 발생할 경우에는 많은 비용이 소모됩니다. 이는 많은 양의 데이터가 변경된 경우에는 매우 비싼 작업이 될 수 있습니다.
  4. 동시성 제어 부하 증가: MVCC를 사용하면 두 개 이상의 트랜잭션이 같은 데이터를 읽을 때 버전 충돌이 발생합니다. 이러한 충돌을 해결하기 위해 데이터베이스 시스템은 많은 추가 작업을 수행해야 하므로, 시스템의 부하가 증가합니다. 따라서, 고성능 트랜잭션 처리가 필요한 경우 MVCC는 적합하지 않을 수 있습니다.