동시성 제어(Concurrency Control)
데이터베이스와 멀티스레딩 환경에서의 동시성 제어
동시성 제어(Concurrency Control)
데이터베이스와 멀티스레딩 환경에서의 동시성 제어, 무엇이 같고 다를까?
동시성 제어(Concurrency Control)
동시성 제어는 소프트웨어 시스템에서 여러 작업이 동시에 실행될 때, 일관성과 안정성을 어떻게 유지할 것인가에 대한 핵심 매커니즘이다.
하지만 적용되는 환경에 따라 모습이 꽤 다르다.
특히 데이터베이스(DBMS)와 멀티스레딩 프로그래밍에서의 동시성 제어는 같은 목적을 공유하면서도 문제의 원인, 해결방식, 사용되는 기술이 전혀 다르다.
공통점? “데이터를 지켜라!”
두 환경 모두 다음 두가지 문제를 방지하기 위해 동시성 제어가 필요하다.
- Race Condition(경쟁 상태): 동시에 접근하면서 비정상적인 결과 발생
- 데이터 무결성 훼손: 값이 예상과 다르게 덮어씌워짐, 손실됨, 불일치 발생 등
두 명이 동시에 같은 계좌에 돈을 입금한다면?
-> 1000원을 2명이 입금하면 2000천원이 되어야하는데 1000원만 입금 된 걸로 반영될 수 있다.
데이터베이스 환경: 트랜잭션과 격리 수준 중심의 제어
- 트랜잭션(Transaction): 데이터베이스에서의 논리적 작업 단위 (ACID 보장)
- 격리 수준(Isolation Level): 트랜잭션 간 상호작용을 어떻게 제한할지 결정
데이터베이스는 주로 트랜잭션(Transaction) 단위로 작업을 처리한다. 각 트랜잭션은 ACID(원자성, 일관성, 고립성, 지속성)를 보장해야 하며, 특히 격리성(Isolation)이 중요한 요소이다.
대표적인 동시성 제어 기법
- 2단계 잠금 프로토콜(2PL): 트랜잭션이 데이터를 읽거나 변경할 때 락을 걸고, 작업이 끝날 때까지 락을 유지하는 방식이다. 예를 들어, 상품 주문 시 다른 사용자가 같은 상품의 재고를 변경하지 못하도록 잠금을 설정한다.
- 다중 버전 동시성 제어(MVCC): 데이터의 여러 버전을 유지하여 동시에 읽기 작업이 이루어질 때도 일관된 데이터를 제공한다. 예를 들어, 게시글 조회 시 최신 수정사항이 반영된 게시글을 읽을 때와 동시에 수정 중인 게시글을 읽을 때 서로 영향을 미치지 않는다.
- 타임스탬프 기반 기법: 각 트랜잭션에 타임스탬프를 부여하여 순서를 결정한다. 예를 들어, 두 개의 트랜잭션이 동시에 같은 데이터를 변경하려고 할 때, 더 오래된 타임스탬프를 가진 트랜잭션이 우선권을 가진다.
예: 주문처리
고객이 동시에 상품을 주문했을 때, 재고 감소 로직은 하나의 트랜잭션 안에서 이루어짐 이 때 동시성 제어가 없으면 재고가 중복 차감되거나, 비정상적으로 처리된다.
멀티스레딩 환경: 공유 메모리 보호 중심 제어
- 스레드(Thread): 프로세스 내에서 실행되는 경량 작업 단위
- 공유 자원(Shared Resource): 메모리, 객체, 파일 등 모든 공유 가능한 값
대표적 동시성 제어 기법
- synchronized 또는 mutex 락: 특정 코드 영역을 한 번에 하나의 스레드만 접근할 수 있도록 한다. 예를 들어, 여러 스레드가 동시에 같은 변수에 접근할 때 동기화로 인해 값의 변경이 정확히 이루어진다.
- ReentrantLock: 좀 더 세부적으로 락을 제어할 수 있다. 예를 들어, 은행 시스템에서 특정 구간만 잠궈 여러 스레드가 효율적으로 동작할 수 있게 만든다.
- Atomic 클래스(AtomicInteger 등): CAS(Compare-And-Swap) 연산으로 락 없이도 원자적 연산을 수행한다. 예를 들어, 카운터 증가와 같은 간단한 연산에서 스레드 충돌 없이 값을 증가시킬 수 있다.
- volatile 변수: 변수 변경 시 다른 스레드에서도 즉시 반영되게 하지만, 복합 연산에서는 원자성을 보장하지 않는다. 예를 들어, 상태값 플래그와 같은 단순 변수 읽고 쓰기에 유용하다.
정리
구분 | 데이터베이스 환경 | 멀티스레딩 환경 |
---|---|---|
단위 | 트랜잭션 | 스레드 |
문제 대상 | 데이터 무결성 | 공유 메모리 충돌 |
주요 기법 | 2PL, MVCC, 타임스탬프 | 락, Atomic 클래스, CAS |
목표 | ACID 보장, 직렬 가능성 | Race condition 방지 |
사용 도구 | DB 엔진 (MySQL, PostgreSQL) | 언어 내 동기화 툴 (Java, Python 등) |
추상화 수준 | 높음 (쿼리 중심) | 낮음 (코드/객체 중심) |
동시성 제어는 환경에 따라 다른 도구와 전략이 필요하다.
DB 환경에서는 트랜잭션 기반, 멀티스레드 환경에서는 코드 단에서의 락이나 CAS가 중심이다. 결국 핵심은 정합성 유지와 충돌 방지다. 어디서든, 시스템은 “한 번에 한 명만 처리하자”는 원칙을 지키기 위해 노력하고 있다고 보면 된다.
This post is licensed under CC BY 4.0 by the author.