😀 Jerry/면접 질문

[1분 면접] DB 시스템에서 동시성 제어하는 방법

Jerry_K 2025. 2. 21. 12:46

📌 면접 답변

대표적인 동시성 제어 방식으로 2가지가 있다.

간단하게만 살펴보고, 이후 추가 학습을 진행해보자. 

 

 

1. MVCC (Multi-Version Concurrency Control)

  • DB의 동시성을 보장하면서 락을 최소화 하여 성능 향상
  • 읽기 작업시 잠금을 사용하지 않아 높은 동시성 제공
  • 읽기 트랙잭션
    • 트랜잭션이 시작된 시점의 데이터 읽음
    • 다른 트랜잭션이 데이터를 수정하더라도 내 트랜잭션이 볼 수 있는 데이터는 변하지 않음
  • 쓰기 트랜잭션
    • 데이터를 수정하면, 새로운 버전 생성
    • 변경 내용이 Commit 되면 새로운 버전 확정
    • 이후 시작하는 트랜잭션들은 이 새로운 버전을 읽음
    • 기존에 진행 중인 트랜잭션들은 본인이 시작한 시점의 스냅샷때문에 최신 데이터 볼 수 없음
  •  다른 트랜잭션이 데이터를 변경해도, 이미 시작된 트랜잭션 읽기 연산에는 영향 주지 않음
  • GC가 더 이상 참조되지 않는 이전 버전의 스냅샷 삭제
  • MVCC의 단점
    • 여러 버전의 데이터가 필요해 디스크 사용량이 증가
    • GC가 필요함

 

예시)

  1. 트랜잭션 A가 시작 (스냅샷 (버전 1)을 가짐)
  2. 트랜잭션 B가 같은 데이터 수정 (새로운 버전 2 생성)
  3. 트랜잭션 B가 Commit 됨
  4. 트랜잭션 A는 여전히 버전 1을 보고 있음 
  5. 트랜잭션 A가 종료된 후 불필요한 버전 1은 삭제 

 

 

2. Lock-Based Concurrency Control

  • 데이터에 접근할 때 잠금을 사용하여 동시성 제어 
  • 데이터를 읽거나 수정할 때 데이터 잠금을 걸어 다른 트랜잭션 접근 제한
  • 잠금을 통해 데이터 일관성과 무결성 직접 제어
  • 읽기 작업은 공유락, 쓰기 작업은 베타락을 사용하여 제어
  • Lock-Based의 단점
    • 다수 트랜잭션이 동일한 데이터 접근 시 성능 저하
    • 잘못된 설계로 Deadlock 발생 위험

 

보통은 MySQL의 InnoDB는 MVCC와 Lock-Based 방식의 장점을 결합하여 동시성 제어 최적화한다.

 


📌 추가 보충

https://ysiksik.github.io/elegant-tekotok/2022-10-16-MARU-Database-Lock/

공유락

  • 읽기 작업을 허용하는 락
  • 여러 개의 트랜잭션이 동시에 같은 데이터에 대해 공유락 획득 가능
  • 공유락이 걸린 상태에서도 다른 트랜잭션 읽기 작업 수행 가능
  • 쓰기 (INSERT, UPDATE, DELETE) 작업은 불가능

 

베타락

  • 읽기 및 쓰기 작업 모두 차단
  • 하나의 트랜잭션만 해당 데이터에 대한 베타락 획득 가능
  • 베타락이 걸린 데이터는 다른 트랜잭션이 읽거나 쓰기 불가능
  • 트랜잭션 종료될 때까지 해당 데이터 접근 제한

📌 내 답변

 

DB 시스템에서 동시에 수정 요청이 들어왔을 때, 한개의 요청이 반영 안되는 문제가 발생 할 수 있다.

이런 상황에서는 해당 테이블 또는 컬럼을 락을 걸어서 순차적으로 요청을 처리하는 방식으로 하면 될 것 같다.

 

너무초라한 내 답변 ... 


📌 내 답변 추가 보충

일반적인 락위 범위를 봐보자 

테이블 락

  • 테이블 전체에 락
  • 간단하고 관리가 쉬움
  • 병렬 처리가 어려워 성능 저하

 

페이지 락

  • 페이지는 테이블을 저장하는 최소 단위 
  • 테이블 락보다는 동시성 향상
  • 특정 페이지에 대한 경합이 심하면 병목 발생

 

행 락

  • 행 단위 락 
  • 세밀한 단위의 락으로 동시성 높음
  • 락을 많이 관리해야해서 오버헤드 발