동시성 제어는 여러 프로세스나 트랜잭션이 동시에 시스템 자원에 접근할 때 발생할 수 있는 일관성 문제를 방지하기 위해 사용하는 메커니즘을 의미한다. 주로 데이터베이스 관리 시스템(DBMS)이나 멀티스레드 프로그램에서 적용되며, 다음과 같은 주요 목적을 가진다.
-
데이터 일관성 유지
- 서로 다른 트랜잭션이 동일한 데이터 항목을 동시에 읽고 쓰는 경우, 일관되지 않은 상태가 발생할 위험을 차단한다.
- 롤백, 커밋, 잠금(lock) 등과 같은 기법을 통해 트랜잭션 간의 격리를 보장한다.
-
교착 상태(Deadlock) 방지
- 자원 할당 순서를 관리하거나 타임아웃, 자원 회수 정책을 적용하여 교착 상태가 발생하지 않도록 한다.
-
성능 최적화
- 과도한 잠금으로 인한 병목을 최소화하기 위해 낙관적 제어(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) 사이의 트레이드오프를 관리하는 핵심 요소이며, 설계 시 트랜잭션 특성, 워크로드, 성능 요구사항을 종합적으로 고려해야 한다.