데이터베이스 동시성 제어
동시성 제어 방식 중 대표적으로 MVCC(Multi-Version Concurrency Control) 와 Lock-Based Concurrency Control 이 있다.
MVCC(Multi-Version Concurrency Control)
MVCC는 데이터의 여러 버전을 유지하여 트랜잭션이 동시에 데이터를 읽고 쓸 수 있도록 하는 방식이다. 각 트랜잭션은 자신만의 일관된 스냅샷을 기반으로 데이터를 읽어, 다른 트랜잭션의 변경 사항에 영향을 받지 않는다.
데이터의 각 버전을 유지하여 읽기 작업이 쓰기 작업과 독립적으로 이루어질 수 있다. 트랜잭션은 시작 시점의 스냅샷을 기반으로 데이터를 읽어, 다른 트랜잭션의 변경 사항을 보지 못한다.
또한 읽기 작업 시 잠금을 사용하지 않아 높은 동시성을 제공한다. 읽기 작업이 잠금에 의해 지연되지 않아서, 읽기 중심의 애플리케이션에서 높은 성능을 보인다. 읽기 작업시 잠금을 사용하지 않기 떄문에 쓰기 작업과 충돌도 줄어든다. 하지만, 여러 버전의 데이터를 유지해야하기 때문에 저장 공간이 더 많이 필요할 수 있다.
Lock-Based Concurrency Control
Lock-Based 방식은 데이터에 접근할 때 잠금(Lock)을 사용해 동시성을 제어한다. 트랜잭션이 데이터를 읽거나 수정할 때 해당 데이터에 잠금을 걸어 다른 트랜잭션의 접근을 제한한다. 즉 잠금을 통해 데이터의 일관성과 무결성을 직접 제어하는 것이다.
데이터에 접근할 때 잠금을 걸어서 다른 트랜잭션의 접근을 제한한다. 읽기 작업은 공유 잠금을, 쓰기 작업은 배타 잠금을 사용해 동시성을 제어한다. 많은 다수의 트랜잭션이 동일한 데이터에 접근할 경우 성능 저하가 발생할 수 있다. 또한 잘못된 잠금 순서나 설계로 인해 교착 상태(Deadlock)이 발생할 위험이 있다.
MVCC와 Lock-Based Concurrency Control 중 어떤것을 선택해야할 까?
실제 데이터베이스 시스템, 특히 MySQL의 InnoDB에서는 MVCC와 Lock-Based 방식의 장점을 결합해 동시성 제어를 최적화한다.
읽기 트랜잭션은 MVCC를 사용하여 일관된 스냅샷을 기반으로 데이터를 읽으므로, 잠금을 최소화하고 높은 동시성을 유지할 수 있다.
쓰기 트랜잭션은 잠금을 사용해서 데이터의 일관성과 무결성을 유지하고, 동시에 데이터 충돌을 방지한다.