ACID 속성
데이터베이스 트랜잭션이 안전하게 수행되기 위한 4가지 필수 속성
한눈에 보기
ACID 는 데이터 무결성을 지키는 네 가지 보장입니다.
| 약자 | 이름 | 뜻 |
|---|---|---|
| A | Atomicity (원자성) | 전부 아니면 전무 |
| 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 안정성 | 격리 수준으로 트레이드오프 |