MVCC(Multi-Version Concurrency Control)란?
1. 개념 및 정의
MVCC는 다중 사용자 환경에서 데이터 동시성을 제어하기 위해 사용하는 데이터베이스 기술입니다. 하나의 데이터에 대해 여러 버전을 유지하며, 사용자 요청에 따라 적절한 데이터를 제공합니다. MVCC는 스냅샷(Snapshot) 기반으로 데이터를 관리하며, 이를 통해 데이터 충돌을 최소화하고 성능을 높이는 동시에 데이터 무결성을 유지합니다.
2. MVCC의 동작 원리
-
데이터 스냅샷 유지
- 데이터 변경 시 기존 데이터를 덮어쓰지 않고 새로운 버전을 생성합니다.
- 변경 전 데이터는 스냅샷으로 백업되어 보관됩니다.
-
데이터 접근 시 동작
- 새로운 사용자가 데이터에 접근할 때 스냅샷 데이터를 기반으로 읽기 작업을 수행합니다.
- 트랜잭션의 상태에 따라 읽는 데이터가 달라질 수 있습니다.
- 변경 완료(Commit): 최종 변경된 데이터가 디스크에 반영됩니다.
- 변경 취소(Rollback): 원본 스냅샷 데이터를 복구합니다.
-
동시 접근 관리
- 여러 사용자가 동일 데이터에 접근해도 각 사용자에게 적절한 버전을 제공합니다.
- 이를 통해 락(Lock) 없이 동시성을 유지합니다.
3. MVCC의 특징
-
장점
- 고속 성능: 일반적인 RDBMS보다 빠르게 작동합니다.
- 읽기와 쓰기 간 독립성: 데이터 변경 중에도 읽기 작업은 기존 스냅샷 데이터를 참조합니다.
- 잠금 불필요: 데이터 잠금 없이 동시성을 유지하므로 효율적입니다.
-
단점
- 불필요한 데이터 증가: 사용되지 않는 데이터가 쌓이므로 정리 시스템이 필요합니다.
- 버전 충돌 관리 필요: 데이터 버전 충돌은 애플리케이션 레벨에서 해결해야 합니다.
- 추가 오버헤드 발생: Undo 로그 관리와 같은 작업으로 I/O 부하가 증가합니다.
4. MySQL에서의 MVCC 구현
MySQL의 InnoDB 엔진은 Undo Log를 활용해 MVCC를 구현합니다.
예시를 통해 InnoDB에서 MVCC의 작동 방식을 살펴봅니다.
-
데이터 삽입
INSERT INTO member(id, name, area) VALUES (1, "MangKyu", "서울");
- 삽입된 데이터는 메모리와 디스크에 저장됩니다.
-
데이터 변경
UPDATE member SET area = "경기" WHERE id = 1;
- 변경 후의 데이터는 InnoDB 버퍼 풀에 기록됩니다.
- 변경 전 데이터는 Undo Log에 저장됩니다.
-
데이터 조회
SELECT * FROM member WHERE id = 1;
- 트랜잭션 격리 수준에 따라 반환되는 데이터가 달라집니다:
- READ_UNCOMMITTED: 변경된 데이터를 반환.
- READ_COMMITTED 이상: Undo Log의 스냅샷 데이터를 반환.
-
트랜잭션 종료
- COMMIT: 최종 데이터가 디스크에 반영됩니다.
- ROLLBACK: Undo Log 데이터를 기반으로 변경 전 상태로 복구됩니다.
- 사용되지 않는 Undo Log 데이터는 트랜잭션이 모두 종료되면 삭제됩니다.
5. MVCC와 트랜잭션 격리 수준
MVCC는 트랜잭션의 격리 수준에 따라 동작 방식이 다릅니다:
- READ_UNCOMMITTED: 커밋되지 않은 데이터를 읽습니다.
- READ_COMMITTED: 커밋된 최신 데이터만 읽습니다.
- REPEATABLE_READ: 트랜잭션 동안 일관된 데이터를 읽습니다.
- SERIALIZABLE: 가장 높은 격리 수준으로 동시성 제한.
6. MVCC의 한계와 극복
- 데이터 정리: 불필요한 데이터 정리를 위해 백그라운드 프로세스가 필요합니다.
- 애플리케이션 레벨의 충돌 해결: 데이터 버전 충돌 시 추가적인 로직 설계가 필요합니다.
- I/O 부하: Undo 로그 관리와 추가 작업으로 인한 오버헤드를 고려해야 합니다.
7. 결론
MVCC는 고속의 데이터 동시성 제어를 제공하며, 특히 읽기 작업이 많은 환경에서 큰 장점을 가집니다. 하지만 데이터 관리 비용이 증가하므로 적절한 트랜잭션 설계와 관리 전략이 필요합니다.
출처 및 참고자료
[Database] MVCC(다중 버전 동시성 제어)란?