Engineering Note

[Database] 트랜잭션(Transaction)과 동시성 제어(Concurrency Control) 본문

Computer Science/Database

[Database] 트랜잭션(Transaction)과 동시성 제어(Concurrency Control)

Software Engineer Kim 2025. 7. 31. 13:40


데이터베이스에서 가장 중요한 트랜잭션과 동시성 제어에 대해 정리해보려고 한다.
 
트랜잭션이란 데이터베이스에서 처리하는 하나의 작업단위로, 관련 작업이 모두 성공하거나, 모두 실패해서 데이터의 일관성을 유지해야 하는 작업 묶음 입니다.
 
트랜잭션의 핵심 속성은 ACID라고 부릅니다.
Atomicity(원자성), Consistency(일관성), Isolation(격리성), Durability(지속성)
 
속성 설명

Atomicity (원자성)모두 수행되거나, 전혀 수행되지 않거나
Consistency (일관성)트랜잭션 전후의 DB 상태가 일관되어야 함
Isolation (격리성)동시에 실행되는 트랜잭션이 서로 영향을 주지 않도록 격리
Durability (지속성)트랜잭션이 성공하면 결과는 영구 반영

 
 
 
트랜잭션과 관련해서 또 다른 중요한 개념이 있는데, 바로 동시성 제어(Concurrency Control)라는 개념입니다. 병행제어라고도 부릅니다.
 
동시성 제어란 여러 트랜잭션이 동시에 같은 데이터에 접근할 때, 데이터의 정합성(일관성)이 깨질 수 있어 이를 보장하기 위한 제어 기법입니다.
 
예들 들어서, 여러 사용자가 동시에 같은 상품에 대해 주문 요청을 하는 경우, 데이터베이스에서 재고수를 감소시켜야 하는데 이럴 경우 재고 데이터가 꼬여버리는 상황이 발생할 수 있습니다. 이런 상황에서 필요한게 락이나, 쓰레드 동기화입니다.
 
트랜잭션과 관련해서 중요한 기술은 한 명의 사용자가 주문하다가 서비스가 장애의 이해 중단되었다면 주문과 관련한 작업이 전부 취소가 되어 데이터를 원상복구 시켜야 하고, 동시성 제어와 관련해서는 여러 명의 사용자가 같은 상품을 주문을 동시에 하는 경우 데이터의 정합성이 깨질 수 있어서 제어해야 하는 기술이 필요합니다.
 
트랜잭션과 관련된 오류는 데이터베이스 자체적인 기술로 해결을 하고 동시성 제어는 개발자가 직접해주어야 하는 경우가 많은데, 해결 방법은 보통 4가지가 있다. 
 
동시성 제어 해결 방법

1. synchronized자바 JVM의 스레드 동기화 키워드 → 단일 서버 환경에서는 가장 간단한 방법
2. 비관적 락 (Pessimistic Lock)DB 차원에서 row-level lock을 걸고 작업 완료 시까지 다른 트랜잭션 접근 차단 (예: SELECT ... FOR UPDATE)
3. 낙관적 락 (Optimistic Lock)DB에 version 필드를 두고, 수정 시점에 변경된 버전을 비교하여 충돌 시 예외 발생 → 충돌이 적을 때 유리
4. Redis 분산 락분산 환경에서 여러 서버 간 동시성을 제어할 수 있는 락 → 마이크로서비스나 서버가 여러 대일 때 주로 사용
Comments