😀 Jerry/면접 질문
[1분 면접] DB 시스템에서 동시성 제어하는 방법
Jerry_K
2025. 2. 21. 12:46
📌 면접 답변
대표적인 동시성 제어 방식으로 2가지가 있다.
간단하게만 살펴보고, 이후 추가 학습을 진행해보자.
1. MVCC (Multi-Version Concurrency Control)
- DB의 동시성을 보장하면서 락을 최소화 하여 성능 향상
- 읽기 작업시 잠금을 사용하지 않아 높은 동시성 제공
- 읽기 트랙잭션
- 트랜잭션이 시작된 시점의 데이터 읽음
- 다른 트랜잭션이 데이터를 수정하더라도 내 트랜잭션이 볼 수 있는 데이터는 변하지 않음
- 쓰기 트랜잭션
- 데이터를 수정하면, 새로운 버전 생성
- 변경 내용이 Commit 되면 새로운 버전 확정
- 이후 시작하는 트랜잭션들은 이 새로운 버전을 읽음
- 기존에 진행 중인 트랜잭션들은 본인이 시작한 시점의 스냅샷때문에 최신 데이터 볼 수 없음
- 다른 트랜잭션이 데이터를 변경해도, 이미 시작된 트랜잭션 읽기 연산에는 영향 주지 않음
- GC가 더 이상 참조되지 않는 이전 버전의 스냅샷 삭제
- MVCC의 단점
- 여러 버전의 데이터가 필요해 디스크 사용량이 증가
- GC가 필요함
예시)
- 트랜잭션 A가 시작 (스냅샷 (버전 1)을 가짐)
- 트랜잭션 B가 같은 데이터 수정 (새로운 버전 2 생성)
- 트랜잭션 B가 Commit 됨
- 트랜잭션 A는 여전히 버전 1을 보고 있음
- 트랜잭션 A가 종료된 후 불필요한 버전 1은 삭제
2. Lock-Based Concurrency Control
- 데이터에 접근할 때 잠금을 사용하여 동시성 제어
- 데이터를 읽거나 수정할 때 데이터 잠금을 걸어 다른 트랜잭션 접근 제한
- 잠금을 통해 데이터 일관성과 무결성 직접 제어
- 읽기 작업은 공유락, 쓰기 작업은 베타락을 사용하여 제어
- Lock-Based의 단점
- 다수 트랜잭션이 동일한 데이터 접근 시 성능 저하
- 잘못된 설계로 Deadlock 발생 위험
보통은 MySQL의 InnoDB는 MVCC와 Lock-Based 방식의 장점을 결합하여 동시성 제어 최적화한다.
📌 추가 보충
공유락
- 읽기 작업을 허용하는 락
- 여러 개의 트랜잭션이 동시에 같은 데이터에 대해 공유락 획득 가능
- 공유락이 걸린 상태에서도 다른 트랜잭션 읽기 작업 수행 가능
- 쓰기 (INSERT, UPDATE, DELETE) 작업은 불가능
베타락
- 읽기 및 쓰기 작업 모두 차단
- 하나의 트랜잭션만 해당 데이터에 대한 베타락 획득 가능
- 베타락이 걸린 데이터는 다른 트랜잭션이 읽거나 쓰기 불가능
- 트랜잭션 종료될 때까지 해당 데이터 접근 제한
📌 내 답변
DB 시스템에서 동시에 수정 요청이 들어왔을 때, 한개의 요청이 반영 안되는 문제가 발생 할 수 있다.
이런 상황에서는 해당 테이블 또는 컬럼을 락을 걸어서 순차적으로 요청을 처리하는 방식으로 하면 될 것 같다.
너무초라한 내 답변 ...
📌 내 답변 추가 보충
일반적인 락위 범위를 봐보자
테이블 락
- 테이블 전체에 락
- 간단하고 관리가 쉬움
- 병렬 처리가 어려워 성능 저하
페이지 락
- 페이지는 테이블을 저장하는 최소 단위
- 테이블 락보다는 동시성 향상
- 특정 페이지에 대한 경합이 심하면 병목 발생
행 락
- 행 단위 락
- 세밀한 단위의 락으로 동시성 높음
- 락을 많이 관리해야해서 오버헤드 발