1. ACID란 무엇인가?
1-1. ACID의 정의
- ACID의 정의: 데이터베이스 트랜잭션의 안정성 및 신뢰성을 보장하는 4가지 핵심 속성 (Atomicity, Consistency, Isolation, Durability)의 약자임. A: Atomicity (원자성) C: Consistency (일관성) I: Isolation (격리성) D: Durability (지속성)
- 각 속성의 상호 관계 4가지 속성은 독립적이지만, 트랜잭션의 성공을 위해 서로 상호 보완적임. 이 중 하나라도 깨지면 트랜잭션이 실패하거나 데이터 문제가 발생함.
- 트랜잭션의 정의 & ACID의 관계 트랜잭션: 데이터베이스의 상태를 변화시키는 하나의 논리적 작업 단위 ACID는 이 트랜잭션이 성공적으로 완료되기 위한 필수 조건
1-2. 왜 필요한가?
- 데이터 유실, 불일치 등의 문제 발생 시나리오 방지 트랜잭션 처리 중 시스템 오류가 발생했을 때 데이터 불일치나 유실을 막기 위해 필수적임 e.g. 은행 계좌 이체 중 송금은 완료되고 입금이 되지 않는 심각한 오류를 방지함.
- 특히 금융 거래 등 중요 시스템에서의 역할 금융, 예약 시스템 등 데이터의 정확성과 신뢰성이 절대적으로 요구되는 시스템에서 시스템 신뢰도를 보장함.
2. A: 원자성 (Atomicity)
All or Nothing
트랜잭션 내의 모든 작업은 하나의 단위로 실행되며, 일부만 실행되거나 실패하지 않음을 보장함.
- 작동 원리:
- 트랜잭션 내 모든 작업은 하나로 묶여 처리됨.
- 성공 시 모든 작업 커밋 (Commit), 실패 시 모든 작업 롤백 (Rollback) 처리됨.
- 핵심 목표: 트랜잭션의 부분 완료 방지를 통해 데이터의 불일치 또는 불완전한 상태를 방지함.
- 원자성 위반 시 문제: 부분 업데이트 (Partial Update) 발생
3. C: 일관성 (Consistency)
**트랜잭션 전후 데이터베이스가 유효한 상태를 유지함.**
- 데이터베이스에 정의된 제약 조건 (Constraints)을 반드시 준수해야 함.
- 작동 원리:
- 트랜잭션이 아무리 복잡해도 외래 키, 도메인 제약, 무결성 제약 등 모든 데이터 규칙을 준수함.
- 트랜잭션 전후 데이터베이스는 항상 유효한 상태임.
- 핵심 목표: 데이터베이스의 논리적 규칙을 깨지 않도록 보장함.
- 일관성 위반 시 문제: 데이터베이스 제약 조건 파괴 e.g. 외래 키를 위반하거나 계좌 잔액이 마이너스가 되는 경우 시스템이 잘못된 상태로 처리됨
4. I: 격리성 (Isolation)
여러 트랜잭션이 동시에 실행되어도 서로 독립적으로 보이도록 보장함.
각 트랜잭션은 다른 트랜잭션의 영향을 받지 않음을 보장함.
- 핵심 목표: 데이터 부정합을 방지하는 동시성 제어
- 격리성 위반 시 문제: 동시성 제어 문제
- Dirty Read (더티 읽기): 롤백될 데이터를 읽는 문제.
- Non-Repeatable Read (반복 불가능 읽기): 같은 데이터를 두 번 읽었을 때 값이 달라지는 문제.
- Phantom Read (유령 읽기): 트랜잭션 내에서 새로운 데이터가 추가/삭제되어 보이는 문제.
격리 수준 (Isolation Levels)
동시성 문제를 다루기 위해 표준화된 4가지 레벨이 있음 (낮은 수준 → 높은 수준)
- Read Uncommitted: 커밋되지 않은 데이터도 읽을 수 있어 Dirty Read 가능.
- Read Committed: 커밋된 데이터만 읽을 수 있음.
- Repeatable Read: 같은 데이터에 대해 반복해서 읽었을 때 값이 같아야 함 (Non-Repeatable Read 방지).
- Serializable: 모든 트랜잭션이 순차적으로 실행되는 것처럼 보임 (가장 엄격).
5. D: 지속성 (Durability)
**트랜잭션이 커밋된 후의 데이터는 영구적으로 기록**되어 유실되지 않음을 보장함.
커밋된 데이터는 시스템 장애나 정전이 발생해도 보존됨.
- 작동 원리
- 커밋 후, 데이터는 주로 로그 파일 기록 및 디스크 쓰기 메커니즘을 통해 안전하게 영구 저장됨.
- 메모리뿐만 아니라 영구 저장 장치 (디스크)에 기록되는 것을 의미함.
- 핵심 목표: 데이터 영구 보존 보장
- 지속성 위반 시 문제: 커밋된 데이터 유실 (Lost Commit) e.g. 시스템 장애 발생 시, 커밋 직후의 데이터가 디스크에 기록되지 못하고 메모리에서 사라져 데이터가 유실됨.
6. ACID-I ) 격리주준별 보장 범위 및 성능 Trade-off
1) Read Uncommitted (가장 낮은 격리 수준)
- 보장 범위 가장 낮음: 커밋되지 않은 데이터의 읽기를 허용
- 발생 가능한 문제
- Dirty Read (오염된 데이터 읽기): 다른 트랜잭션이 Rollback할 데이터를 읽음.
- Non-Repeatable Read 및 Phantom Read 모두 발생 가능
- 성능 Trade-off:
- 성능 우수 (가장 빠름): Lock 사용을 최소화하여 동시성이 가장 높음.
2) Read Committed (중간 격리 수준, 대부분의 DBMS 기본값)
- 보장 범위 Dirty Read 방지: 커밋된 데이터만 읽도록 보장함.
- 발생 가능한 문제
- Non-Repeatable Read 및 Phantom Read 발생 가능
- 성능 Trade-off
- 성능 균형: 적절한 Lock 사용으로 Dirty Read를 막으면서도 합리적인 동시성을 유지함.
3) Repeatable Read (높은 격리 수준)
- 보장 범위 Dirty Read 방지. Non-Repeatable Read 방지: 트랜잭션 내에서 같은 데이터를 여러 번 읽을 때 항상 동일한 값을 보장함.
- 발생 가능한 문제
- Phantom Read 발생 가능: SELECT 조건에 맞는 행의 수는 달라질 수 있음.
- 성능 Trade-off
- 성능 저하: 읽기 작업에도 Lock을 걸어 트랜잭션 종료 시까지 유지하므로 동시성 저하가 발생함.
4) Serializable (가장 높은 격리 수준)
- 보장 범위 Dirty Read, Non-Repeatable Read, Phantom Read 모두 방지 (데이터 정합성 최고). 모든 트랜잭션이 순차적으로 실행되는 것과 같은 효과를 보장함.
- 발생 가능한 문제
- 성능 Trade-off
- 성능 매우 저하 (가장 느림): 광범위하고 엄격한 Lock 사용으로 인해 동시성 처리 성능이 크게 감소하고 Deadlock 가능성이 증가합니다.