대표적인 동시성 제어 방법으로는 MVCC와 Lock-Based Concurrency Control이 있습니다.
MVCC (Multi-Version Concurrency Control)
MVCC는 데이터의 여러 버전을 유지하여 트랜잭션이 동시에 데이터를 읽고 쓸 수 있도록 하는 방식입니다. 각 트랜잭션은 자신만의 일관된 스냅샷을 기반으로 데이터를 읽어, 다른 트랜잭션의 변경 사항에 영향을 받지 않습니다.
데이터의 각 버전을 유지하여 읽기 작업과 쓰기 작업이 독립적으로 이루어질 수 있습니다. 트랜잭션은 시작 시점의 스냅샷을 기반으로 데이터를 읽어, 다른 트랜잭션의 변경 사항을 보지 못합니다.
MVCC는 읽기 작업 시 잠금을 사용하지 않아 높은 동시성을 제공합니다. 읽기 작업이 잠금에 의해 지연되지 않아 읽기 중심의 애플리케이션에서 우수한 성능을 보입니다. 또한 읽기 작업 시 잠금을 사용하지 않으므로 쓰기 작업과의 충돌이 줄어들며, 트랜잭션이 시작된 시점의 데이터 상태를 기반으로 읽기 작업을 수행하여 일관성을 유지합니다.
하지만 여러 버전의 데이터를 유지해야 하므로 저장 공간이 더 많이 필요할 수 있습니다.
Lock-Based Concurrency Control
Lock-Based 방식은 데이터에 접근할 때 잠금(Lock)을 사용하여 동시성을 제어합니다. 트랜잭션이 데이터를 읽거나 수정할 때 해당 데이터에 잠금을 걸어 다른 트랜잭션의 접근을 제한합니다. 즉, 잠금을 통해 데이터의 일관성과 무결성을 직접적으로 제어합니다.
데이터에 접근할 때 잠금을 걸어 다른 트랜잭션의 접근을 제한합니다. 이때 읽기 작업은 공유 잠금을, 쓰기 작업은 배타 잠금을 사용하여 동시성을 제어합니다.
Lock-Based 방식은 다수의 트랜잭션이 동일한 데이터에 접근할 경우 성능 저하가 발생할 수 있습니다. 또 잘못된 잠금 순서나 설계로 인해 교착 상태(Deadlock)가 발생할 위험이 있습니다.
두 가지 방식 중 어떤 걸 사용해야 하나요?
실제 데이터베이스 시스템, 그 중 MySQL의 InnoDB는 두 가지 방식의 장점을 결합하여 동시성 제어를 최적화합니다.
읽기 트랜잭션은 MVCC를 사용하여 일관된 스냅샷을 기반으로 데이터를 읽어, 잠금을 최소화하고 높은 동시성을 유지합니다.
쓰기 트랜잭션은 잠금을 사용하여 데이터의 일관성과 무결성을 유지하면서, 동시에 데이터 충돌을 방지합니다.
'백엔드 면접' 카테고리의 다른 글
| CORS란 무엇인가요? (1) | 2024.12.21 |
|---|---|
| 갭락과 넥스트키 락은 무엇이며, 어떻게 팬텀 리드를 방지하나요? (0) | 2024.12.19 |
| HTTP 메서드에서 멱등성이란 무엇인가요? (0) | 2024.12.17 |
| 웹사이트에 접근했을 때 발생하는 일련의 과정에 대해 설명해 주세요. (0) | 2024.12.16 |
| 스레드, 프로세스, 코어는 많을수록 좋을까요? (0) | 2024.12.14 |