WIPIVERSE

동시성 제어

동시성 제어는 여러 프로세스나 트랜잭션이 동시에 시스템 자원에 접근할 때 발생할 수 있는 일관성 문제를 방지하기 위해 사용하는 메커니즘을 의미한다. 주로 데이터베이스 관리 시스템(DBMS)이나 멀티스레드 프로그램에서 적용되며, 다음과 같은 주요 목적을 가진다.

  1. 데이터 일관성 유지

    • 서로 다른 트랜잭션이 동일한 데이터 항목을 동시에 읽고 쓰는 경우, 일관되지 않은 상태가 발생할 위험을 차단한다.
    • 롤백, 커밋, 잠금(lock) 등과 같은 기법을 통해 트랜잭션 간의 격리를 보장한다.
  2. 교착 상태(Deadlock) 방지

    • 자원 할당 순서를 관리하거나 타임아웃, 자원 회수 정책을 적용하여 교착 상태가 발생하지 않도록 한다.
  3. 성능 최적화

    • 과도한 잠금으로 인한 병목을 최소화하기 위해 낙관적 제어(optimistic concurrency control)와 비관적 제어(pessimistic concurrency control) 등 다양한 전략이 사용된다.

주요 기법

기법 설명
잠금(Locking) 데이터 항목에 대한 배타적 잠금(exclusive lock) 혹은 공유 잠금(shared lock)을 부여하여 동시에 접근을 제한한다.
시간 스탬프(Time-stamping) 각 트랜잭션에 시간 스탬프를 부여해, 충돌이 발생할 경우 오래된 트랜잭션을 취소하거나 재시도한다.
다중 버전 관리(Multi-Version Concurrency Control, MVCC) 데이터의 여러 버전을 유지해, 읽기 작업은 기존 버전을 사용하고 쓰기 작업은 새로운 버전을 생성한다.
낙관적 제어(Optimistic Concurrency Control) 충돌이 드물다고 가정하고 먼저 작업을 수행한 뒤, 커밋 시점에 충돌 여부를 검사한다.
비관적 제어(Pessimistic Concurrency Control) 충돌 가능성이 높다고 판단하여 사전에 잠금을 걸어 충돌을 회피한다.

적용 분야

  • 관계형 데이터베이스: Oracle, MySQL, PostgreSQL 등에서 트랜잭션 격리 수준(Isolation Level)과 잠금 정책을 통해 구현한다.
  • 분산 시스템: 분산 데이터베이스나 분산 파일 시스템에서 두 단계 커밋(two-phase commit) 등과 결합되어 일관성을 유지한다.
  • 멀티스레드 프로그래밍: Java, C++ 등 언어에서 synchronized, mutex, semaphore 등을 이용해 임계 구역을 보호한다.

참고 사항

  • 동시성 제어는 시스템의 일관성(consistency)과 가용성(availability) 사이의 트레이드오프를 관리하는 핵심 요소이며, 설계 시 트랜잭션 특성, 워크로드, 성능 요구사항을 종합적으로 고려해야 한다.
둘러보기

더 찾아볼 만한 주제

    전체 문서 보기