ACID 원칙이란?
ACID는 데이터베이스 트랜잭션이 안정적으로 수행되기 위한 4가지 핵심 원칙
트랜잭션이 처리 중 실패하거나 시스템에 장애가 발생하더라도, 데이터의 신뢰성과 무결성을 보장하기 위한 기준
Atomicity (원자성)
Consistency (일관성)
Isolation (격리성)
Durability (지속성)
1. 원자성 (Atomicity)
트랜잭션 내의 작업은 모두 반영되거나, 모두 반영되지 않아야 함
> 하나라도 실패하면 전체 작업이 취소(rollback)되어야 함
✔️ 필요한이유
하나라도 작업이 실패한다면, 나머지 작업도 모두 취소되어야 데이터가 불완전하게 저장되는 것을 막을 수 있음
✔️ 예시
A가 B에게 1만 원을 송금하는 과정
A 계좌에서 1만 원 출금 + B 계좌에 1만 원 입금
입금 중에 오류 발생했다면?
출금만 완료된 채 트랜잭션이 끝나면 돈이 사라지게 됨
→ 이걸 방지하는 것이 원자성의 역할
2. 일관성 (Consistency)
트랜잭션 실행 전과 후 데이터는 항상 정해진 규칙(제약조건)에 따라 일관된 상태를 유지해야 함
✔️ 필요한이유
데이터베이스는 무결성 제약 조건(예: 외래키, 고유값, 잔고 ≥ 0 등)이 항상 지켜져야 함
트랜잭션 수행으로 인해 제약이 깨지면 데이터가 신뢰를 잃게 됨
✔️ 예시
은행 계좌의 잔고는 0보다 작을 수 없다는 조건이 있다고 가정했을 때
어떤 트랜잭션이 이 조건을 어긴다면, 일관성이 깨진 것
→ 이런 트랜잭션은 시작조차 거부되거나 롤백되어야 함
3. 격리성 (Isolation)
동시에 여러 트랜잭션이 수행될 때, 서로 영향을 주지 않고 독립적으로 실행되어야 함
> 각각의 트랜잭션이 혼자 실행되는 것처럼 보여야 됨
✔️ 필요한이유
동시성 제어를 통해 데이터 충돌, 비일관성 문제를 방지해야 합
예: 더티 리드(Dirty Read), 반복 불가능한 읽기, 팬텀 리드( Phantom Read)
✔️ 예시
두 명의 사용자가 동시에 같은 상품을 구매 :
둘 다 재고가 1개일 때 상품을 구매 요청
동시에 처리된다면 둘 다 결제 성공, 재고는 1인데 2명이 구매하게됨
→ 격리성이 없으면 이런 문제가 발생할 수 있음
🧱 격리 수준 (Isolation Level)
데이터베이스는 성능과 정확성 사이에서 격리 수준을 조정할 수 있음
| 격리수준 | 설명 | 특징 |
| Read Uncommitted | 커밋되지 않은 데이터도 읽음 | Dirty Read 발생 가능 |
| Read Committed | 커밋된 데이터만 읽음 | Dirty Read 방지 |
| Repeatable Read | 트랜잭션 중 같은 데이터를 반복 조회 가능 | Non-repeatable Read 방지 |
| Serializable | 가장 엄격한 수준, 완전한 격리 | 성능 낮지만 오류 최소화 |
4. 지속성 (Durability)
성공적으로 완료(커밋)된 트랜잭션의 결과는 절대로 손실되지 않아야 함
> 시스템이 갑자기 정전되거나 장애가 나더라도, 커밋된 데이터는 보존
✔️ 필요한이유
트랜잭션이 성공적으로 끝났다면 그 결과는 장애 상황에서도 복구 가능해야 함
로그 기록, 디스크 저장, 백업 등으로 보장
✔️ 예시
은행에서 입금이 완료되었는데, 정전이 발생해도 그 입금 내역은 보존되어 있어야 함
📋 ACID 요약
| 속성 | 설명 | 목적 |
| 원자성(Atomicity) | 트랜잭션은 전부 실행되거나 전부 취소됨 | 중간 실패 방지 |
| 일관성(Consistency) | 트랜잭션 전후로 규칙 유지 | 데이터 무결성 보장 |
| 격리성(Isolation) | 다른 트랜잭션과 독립적으로 실행됨 | 동시성 문제 방지 |
| 지속성(Durability) | 성공한 트랜잭션은 시스템 장애에도 보존됨 | 결과의 영속성 확보 |
'자바 업스킬링 과정 정리 > SQL' 카테고리의 다른 글
| EXPLAIN으로 SQL쿼리 성능 분석 (0) | 2025.07.22 |
|---|---|
| 인덱스 실습: MySQL에서 성능 차이 확인하기 (0) | 2025.07.14 |