트랜잭션 ACID 쉽게 이해하기 — 핵심 개념 · 예시 · 실무 팁
데이터베이스에서 트랜잭션은 한 덩어리 작업입니다. ACID는 그 트랜잭션이 안전하게 동작하도록 보장하는 네 가지 원칙입니다. 복잡해 보이지만 비유·예시로 빠르게 이해해 봅시다.
- A — Atomicity(원자성): 트랜잭션은 모두 성공하든지, 아니면 전부 취소되어야 한다 (all-or-nothing).
- C — Consistency(일관성): 트랜잭션 전/후에 데이터 규칙(무결성 제약조건)은 항상 유지되어야 한다.
- I — Isolation(격리성): 동시에 실행되는 트랜잭션들이 서로 간섭하지 않아야 한다.
- D — Durability(지속성): 커밋된 변경은 시스템 오류가 나도 영구히 보존되어야 한다.
간단한 비유: 은행 이체로 보는 ACID
상황: A가 B에게 10,000원을 이체한다.
- A (Atomicity): A 계좌에서 돈이 빠져나가고 B 계좌에 들어가야 한다. 둘 중 하나만 일어나면 안 됨 — 둘 다 성공하거나 둘 다 취소.
- C (Consistency): 은행 규칙(잔액 >= 0 등)을 만족해야 한다. 트랜잭션 후에도 총액 보존 같은 제약이 유지되어야 함.
- I (Isolation): 동시에 여러 이체가 있어도 각 이체가 서로 섞여 이상한 결과(중복 출금 등)를 만들면 안 됨.
- D (Durability): 커밋 완료 후에는 서버가 다운되어도 이체 내역이 사라지면 안 됨 — 로그/디스크에 안전히 기록.
A — Atomicity (원자성)
트랜잭션은 여러 연산(예: UPDATE, INSERT, DELETE)의 묶음입니다. 원자성은 그 묶음이 모두 적용되거나 모두 적용되지 않아야 함을 의미합니다.
BEGIN;
UPDATE accounts SET balance = balance - 10000 WHERE id = 'A';
UPDATE accounts SET balance = balance + 10000 WHERE id = 'B';
COMMIT;
중간에 오류 발생 시 ROLLBACK으로 처음 상태로 되돌립니다.
C — Consistency (일관성)
일관성은 DB가 정한 규칙(제약조건, 트리거, 통화 규칙 등)이 트랜잭션 전후에 깨지지 않아야 함을 뜻합니다. 트랜잭션 내부에서 규칙을 위반하면 커밋이 거부됩니다.
예: 주문 테이블에서 quantity > 0 이나 외래키 무결성 등이 해당합니다.
I — Isolation (격리성)
동시에 여러 트랜잭션이 실행될 때, 마치 순서대로 실행된 것처럼 보여야 합니다(=격리). 하지만 완전히 직렬화하면 성능이 떨어집니다. 그래서 다양한 격리 수준이 있습니다.
- Read Uncommitted — 가장 낮음. 커밋되지 않은 데이터를 읽을 수 있음(더티 리드 발생 가능).
- Read Committed — 커밋된 데이터만 읽음(오라클/기본 MySQL InnoDB가 이 수준의 변형 사용).
- Repeatable Read — 같은 트랜잭션 내에서 같은 쿼리는 같은 결과를 보장(일부 DB는 팬텀 문제 처리 차이 있음).
- Serializable — 가장 엄격함. 완전 직렬화, 동시성 성능 저하 가능.
격리 수준이 낮을수록 동시성은 좋아지나 다음과 같은 이상 현상이 발생할 수 있음: 더티 리드, 반복 불가능한 읽기, 팬텀 리드.
D — Durability (지속성)
커밋된 데이터는 시스템 장애(서버 재시작, 전원 장애 등)에도 영구히 보존되어야 합니다. 이를 위해 DB는 로그(Write-Ahead Logging)과 디스크 동기화를 사용합니다.
실무에서는 디스크, RAID, 백업, 리플리케이션과 같은 인프라 레이어가 Durability를 보조합니다.
격리성에서 발생할 수 있는 이상 현상 (간단 시각)
위 그림은 T1이 값을 바꾸고 커밋 전에 T2가 그 값을 읽는 상황 — 격리가 낮으면 이런 더티 리드가 발생합니다.
실무 팁 & 트레이드오프
- 성능 vs 안전성: 엄격한 격리(Serializable)는 안전하지만 성능 저하. 대부분의 시스템은 Repeatable Read 또는 Read Committed로 절충.
- 짧은 트랜잭션을 유지하라 — 오래 걸리는 트랜잭션은 락 경합을 유발.
- 비관적/낙관적 동시성 제어: 락을 적극 쓰는 방법 vs 충돌 시 재시도하는 방법. 상황에 맞게 선택.
- 장애 대비: WAL, 체크포인트, 백업, 리플리케이션으로 Durability 및 가용성 확보.
도입 전 체크리스트 (간단)
- 트랜잭션이 길어지는 작업(대량 업데이트)은 배치로 처리 가능하지 않은가?
- 격리 수준은 비즈니스 요구(정확성)와 성능 요구(응답성) 중 어느 쪽을 더 중시하는가?
- 커밋 빈도와 로그/디스크 I/O를 고려한 인프라(디스크 성능, 백업 정책) 준비가 되어 있는가?
- 동시성 이슈를 검증하기 위해 부하 테스트/콘커런시 테스트를 수행했는가?
마무리 — 한 문장 정리
ACID는 트랜잭션의 정확성(Consistency)과 안전성(Durability, Atomicity)동시성(Isolation)을 관리하는 규칙 집합입니다. 운영 환경에서는 이 원칙들을 비즈니스 요구와 성능 사이에서 적절히 균형 맞춰 적용하세요.
'개발 · IT > 백엔드' 카테고리의 다른 글
| Redis 캐싱 구조와 활용 예제 (0) | 2025.11.18 |
|---|---|
| MySQL 쿼리 최적화 방법 10가지 (0) | 2025.11.18 |
| 조인(LEFT / INNER / RIGHT) 완전 정리 — 개념 · 예제 · 활용 팁 (0) | 2025.11.17 |
| DB 인덱스 개념과 성능 비교 — 쉽게 이해하는 실전 가이드 (0) | 2025.11.16 |
| 실무에서 자주 쓰는 SQL 튜닝 기법 성능 최적화 가이드 (0) | 2025.11.14 |
댓글