매일 공부/Backend CS

[매일메일] 데이터베이스 시스템 동시성 제어 (MVCC, Lock-Based Concurrency Control)

개발하는 동그리 2025. 4. 8. 23:11
728x90
반응형

 

MVCC(Multi-Version Concurrency Control) 란?

 

대표적인 동시성 제어 방식으로 MVCC(Multi-Version Concurrency Control)  Lock-Based Concurrency Control이 있습니다.

 

🔒 1. MVCC(Multi-Version Concurrency Control)

MVCC는 데이터의 여러 버전을 유지하여 트랜잭션이 동시에 데이터를 읽고 쓸 수 있도록 하는 방식입니다. 각 트랜잭션은 자신만의 일관된 스냅샷을 기반으로 데이터를 읽어, 다른 트랜잭션의 변경 사항에 영향을 받지 않습니다.

데이터의 각 버전을 유지하여 읽기 작업이 쓰기 작업과 독립적으로 이루어질 수 있습니다. 트랜잭션은 시작 시점의 스냅샷을 기반으로 데이터를 읽어, 다른 트랜잭션의 변경 사항을 보지 못합니다.

또한 읽기 작업 시 잠금을 사용하지 않아 높은 동시성을 제공합니다. 읽기 작업이 잠금에 의해 지연되지 않아, 읽기 중심의 애플리케이션에서 우수한 성능을 보입니다. 읽기 작업 시 잠금을 사용하지 않으므로, 쓰기 작업과의 충돌이 줄어듭니다. 하지만 여러 버전의 데이터를 유지해야 하므로 저장 공간이 더 많이 필요할 수 있습니다.

트랜잭션이 시작된 시점의 데이터 상태를 기반으로 읽기 작업을 수행하여 일관성을 유지합니다. 또 갭락과 넥스트키 락을 통해 팬텀 리드를 방지합니다.

 

🔒 2. Lock-Based Concurrency Control

Lock-Based 방식은 데이터에 접근할 때 잠금(Lock) 을 사용하여 동시성을 제어합니다. 트랜잭션이 데이터를 읽거나 수정할 때 해당 데이터에 잠금을 걸어 다른 트랜잭션의 접근을 제한합니다. 즉, 잠금을 통해 데이터의 일관성과 무결성을 직접적으로 제어합니다.

데이터에 접근할 때 잠금을 걸어 다른 트랜잭션의 접근을 제한합니다. 읽기 작업은 공유 잠금을, 쓰기 작업은 배타 잠금을 사용하여 동시성을 제어합니다. 많은 다수의 트랜잭션이 동일한 데이터에 접근할 경우 성능 저하가 발생할 수 있습니다. 또 잘못된 잠금 순서나 설계로 인해 교착 상태(Deadlock)가 발생할 위험이 있습니다.


🔒 2-1. 공유 잠금 (Shared Lock, S-Lock)

✅ 정의

공유 잠금은 데이터를 “읽기 전용”으로 접근하는 트랜잭션이 획득하는 잠금입니다.
여러 트랜잭션이 동시에 동일한 데이터에 공유 잠금을 획득할 수 있습니다.
단, 공유 잠금이 설정된 데이터는 수정(쓰기)할 수 없습니다.


✅ 특징

항목 설명
사용 시점 SELECT … LOCK IN SHARE MODE, 또는 내부적으로 REPEATABLE READ 이상에서의 읽기
동시에 허용되는 락 다른 공유 잠금은 허용, 배타 잠금은 대기
목적 데이터 무결성을 유지하며 읽기 작업 수행
예시 SELECT * FROM account WHERE id=1 LOCK IN SHARE MODE;→ 다른 트랜잭션이 이 계정을 읽을 수는 있지만, 수정은 대기해야 함

✅ 실용 예

은행 시스템에서 A 트랜잭션이 사용자 계좌를 읽고 분석할 때, 동시에 B 트랜잭션이 수정하지 못하도록 공유 잠금을 사용하여 읽기 무결성을 확보합니다.

 

🔐 2-2. 배타 잠금 (Exclusive Lock, X-Lock)

✅ 정의

배타 잠금은 데이터에 쓰기 작업(INSERT, UPDATE, DELETE 등)을 수행하는 트랜잭션이 설정하는 잠금입니다.
배타 잠금은 해당 데이터에 대해 어떤 잠금도 병행 허용하지 않습니다.


✅ 특징

항목 설명
사용 시점 INSERT, UPDATE, DELETE 등의 쓰기 작업 시
동시에 허용되는 락 없음. 다른 트랜잭션은 읽기든 쓰기든 모두 대기해야 함
목적 데이터를 안전하게 수정하기 위한 배타적 제어
예시 UPDATE account SET balance = balance - 100 WHERE id = 1;→ 다른 트랜잭션은 해당 계정에 읽기나 쓰기 모두 불가 (락 해제 전까지)

✅ 실용 예

A 트랜잭션이 사용자의 잔고를 차감하고 있을 때, 다른 트랜잭션이 해당 사용자 계정에 접근하지 못하도록 완전 차단합니다.

 

✅ 락 호환성 테이블 (Lock Compatibility)

요청한 락 기존의 걸린 락 종류 공유 잠금 가능? 베타 잠금 가능?
공유 잠금 공유 잠금(S) ✅ 가능 ❌ 불가능
배타 잠금 공유 잠금(S) ❌ 불가능 ❌ 불가능
공유 잠금 배타 잠금(X) ❌ 불가능 ❌ 불가능
배타 잠금 배타 잠금(X) ❌ 불가능 ❌ 불가능


🔒 3. MVCC와 Lock-Based Concurrency Control 둘 중 어떤 걸 사용?

실제 데이터베이스 시스템, 특히 MySQL의 InnoDB는 MVCC와 Lock-Based 방식의 장점을 결합하여 동시성 제어를 최적화합니다.
읽기 트랜잭션은 MVCC를 사용하여 일관된 스냅샷을 기반으로 데이터를 읽으므로, 잠금을 최소화하고 높은 동시성을 유지할 수 있습니다.
쓰기 트랜잭션은 잠금을 사용하여 데이터의 일관성과 무결성을 유지하면서, 동시에 데이터 충돌을 방지합니다.
728x90
반응형