ACID 속성
데이터베이스 트랜잭션이 안전하게 수행되기 위한 4가지 필수 속성
한눈에 보기
ACID = 데이터 무결성의 4대 보장
A - Atomicity (원자성) → 전부 or 전무
C - Consistency (일관성) → 규칙 준수
I - Isolation (격리성) → 간섭 차단
D - Durability (지속성) → 영구 보존
1. Atomicity (원자성)
"All or Nothing", 전부 성공하거나 전부 취소
A 계좌에서 B 계좌로 10만원을 옮기는 트랜잭션입니다.
| 순서 | 동작 | 결과 |
|---|---|---|
| 1 | A 계좌에서 10만원을 뺀다 | 성공 |
| 2 | B 계좌에 10만원을 넣는다 | 실패 |
롤백하면 1번도 함께 취소되므로, A 에서만 빠지고 B 에는 들어가지 않는 상태를 막습니다.
2. Consistency (일관성)
트랜잭션 전후로 DB의 제약 조건이 항상 만족
[규칙] 잔고 >= 0
A 잔고: 5만원
A → B로 10만원 이체 시도
→ A 잔고 = -5만원 (규칙 위반!)
→ 트랜잭션 거부
→ DB는 항상 일관된 상태 유지
3. Isolation (격리성)
동시에 실행되는 트랜잭션끼리 서로 간섭하지 않음
[격리 없이]
Tx1: A 잔고 읽기 → 10만원
Tx2: A 잔고 읽기 → 10만원
Tx1: A -= 10만원 → 0원 (커밋)
Tx2: A -= 10만원 → 0원 (커밋)
→ 20만원이 빠져야 하는데 10만원만!
[격리 있으면]
Tx1이 A를 사용 중 → Tx2는 대기
→ 순차적으로 안전하게 처리
격리 수준: READ UNCOMMITTED → READ COMMITTED → REPEATABLE READ → SERIALIZABLE
4. Durability (지속성)
커밋된 데이터는 시스템 장애에도 보존
트랜잭션 커밋 완료!
↓
서버 전원 꺼짐 💥
↓
재시작 후 → 커밋 데이터 그대로!
[구현 방법]
WAL (Write-Ahead Log)
1. 변경 내용을 로그에 먼저 기록
2. 그 후 실제 데이터 변경
3. 장애 시 로그로 복구
ACID 위반 사례
| 위반 | 현상 | ACID 속성 |
|---|---|---|
| 이체 중 에러 | 돈이 증발 | Atomicity |
| 잔고 마이너스 | 규칙 깨짐 | Consistency |
| 동시 수정 충돌 | 데이터 덮어쓰기 | Isolation |
| 커밋 후 유실 | 데이터 사라짐 | Durability |
NoSQL과 ACID
| DB 유형 | ACID 지원 |
|---|---|
| MySQL/PostgreSQL | 완전 지원 |
| MongoDB (4.0+) | 멀티 문서 트랜잭션 지원 |
| Redis | 단일 명령 원자적 |
| DynamoDB | 조건부 (트랜잭션 API) |
실무 연결
| 상황 | ACID 관련 포인트 |
|---|---|
| 결제 시스템 | ACID 필수 (돈 관련) |
| 로그 수집 | 일부 유실 허용 가능 |
| MSA | Saga 패턴으로 분산 트랜잭션 |
| 성능 vs 안정성 | 격리 수준으로 트레이드오프 |