1. MVCC(Multi-Version Concurrency Control)
- MVCC는 MySQL의 InnoDB 스토리지 엔진에서 사용하는 동시성 제어 메커니즘입니다.
- 여러 트랜잭션이 동시에 데이터베이스에 접근할 때, 각 트랜잭션이 데이터의 특정 버전(스냅샷)을 보게 함으로써 동시성과 격리성을 모두 제공합니다.
- MVCC의 핵심 아이디어는 데이터를 읽는 트랜잭션이 데이터를 수정하는 트랜잭션을 차단하지 않고, 반대로 수정하는 트랜잭션도 읽는 트랜잭션을 차단하지 않는 것입니다.
- 여시서 MVCC의 멀티 버전이라 함은 하나의 레코드에 대해 여러 개의 버전이 동시에 관리된다는 의미입니다.
- MVCC의 가장 큰 목적은 Lock(잠금)을 사용하지 않고 일관된 읽기를 제공하는 것입니다.
1.1 MVCC의 주요 특징
- 데이터의 여러 버전을 동시에 유지합니다.
- 각 트랜잭션은 트랜잭션 시작 시점의 일관된 데이터베이스 스냅샷을 볼 수 있습니다.
- 락(lock)을 최소화하여 동시성을 향상시킵니다.
- 읽기 작업(SELECT)이 쓰기 작업(INSERT, UPDATE, DELETE)을 차단하지 않습니다.
- InnoDB에서는 Undo 로그를 활용하여 MVCC를 구현합니다.
1.2 잠금 없는 일관된 읽기
- InnoDB 스토리지 엔진은 MVCC 기술을 활용하여 읽기 작업 시 잠금을 사용하지 않습니다.
- SERIALIZABLE 격리 수준을 제외한 모든 격리 수준(READ UNCOMMITTED, READ COMMITTED, REPEATABLE READ)에서 일반 SELECT 쿼리는 다른 트랜잭션이 레코드에 걸어둔 잠금과 관계없이 즉시 읽기가 가능합니다.
- 다른 트랜잭션이 레코드를 변경하고 아직 커밋하지 않아 잠금 상태인 레코드도, InnoDB는 언두 로그를 활용하여 변경 이전의 데이터 버전을 읽을 수 있습니다.
- 그러나 이로 인해 장기 실행 트랜잭션이 존재할 경우, 해당 트랜잭션의 일관된 읽기를 위해 언두 로그를 삭제하지 못하고 계속 유지해야 하므로 서버 성능이 저하될 수 있습니다.
- 따라서 성능 최적화를 위해 트랜잭션은 가능한 빨리 커밋 또는 롤백하여 종료하는 것이 좋습니다.
2. MVCC의 동작 원리
- 지금부터는 MVCC의 동작 원리를 살펴보겠습니다.
2.1 트랜잭션 ID 활용