"계좌 이체 중간에 서버가 죽으면 돈은 어떻게 되나요?" 데이터베이스를 처음 배우면 이런 걱정이 듭니다. ACID는 바로 그 걱정에 대한 답입니다. 여러 작업을 하나의 트랜잭션으로 묶어, 중간에 무슨 일이 생겨도 데이터가 깨지지 않도록 보장하는 4가지 약속이 ACID입니다. 단어가 어려워 보이지만 송금 한 건으로 전부 설명됩니다.
ACID 4원칙 한눈에
| 원칙 | 영문 | 핵심 | 송금 예시 |
|---|---|---|---|
| 원자성 | Atomicity | 전부 성공 아니면 전부 취소 | 출금만 되고 입금 실패면 둘 다 롤백 |
| 일관성 | Consistency | 규칙을 어기는 상태로 못 만든다 | 잔액이 음수가 되면 거부 |
| 격리성 | Isolation | 동시 실행이 서로 간섭 안 함 | 두 이체가 같은 잔액을 동시에 못 건드림 |
| 지속성 | Durability | 커밋되면 영구히 남는다 | 완료 후 정전돼도 결과 유지 |
송금으로 보는 4원칙
A가 B에게 1만 원을 보내는 트랜잭션은 두 작업으로 이뤄집니다.
BEGIN;
UPDATE account SET balance = balance - 10000 WHERE id = 'A';
UPDATE account SET balance = balance + 10000 WHERE id = 'B';
COMMIT;
원자성은 이 두 UPDATE를 하나로 묶습니다. A에서 빠졌는데 B에 안 들어가는 중간 상태는 허용되지 않습니다. 둘 중 하나라도 실패하면 ROLLBACK으로 통째로 되돌립니다.
일관성은 "잔액은 0 이상"처럼 미리 정한 규칙을 트랜잭션 전후로 항상 지키게 합니다. A의 잔액이 1만 원보다 적으면 제약 조건에 걸려 거래 자체가 거부됩니다.
격리성은 동시성 문제를 막습니다. A의 잔액이 5천 원인데 두 이체가 동시에 "5천 원 있으니 OK"라고 판단해 둘 다 빠져나가는 일(-5000 발생)을 격리 수준으로 막습니다.
지속성은 COMMIT이 끝난 거래는 디스크에 안전하게 기록되어, 직후 서버가 꺼져도 사라지지 않음을 보장합니다.
격리성은 단계가 있다
격리성은 비용과 안전성의 트레이드오프라 4단계로 나뉩니다.
| 격리 수준 | 막는 문제 | 특징 |
|---|---|---|
| READ UNCOMMITTED | 거의 안 막음 | 커밋 안 된 값까지 읽힘(더티 리드) |
| READ COMMITTED | 더티 리드 차단 | 많은 DB의 기본값 |
| REPEATABLE READ | 반복 읽기 보장 | MySQL InnoDB 기본값 |
| SERIALIZABLE | 모든 충돌 차단 | 가장 안전하나 가장 느림 |
높을수록 안전하지만 동시 처리량이 줄어듭니다. 그래서 대부분은 READ COMMITTED나 REPEATABLE READ를 씁니다.
요점 정리
- ACID는 트랜잭션이 중간 실패·동시 접근·장애에도 데이터를 지키는 4가지 약속.
- 원자성=전부 아니면 전무, 일관성=규칙 유지, 격리성=동시 간섭 차단, 지속성=커밋 후 영구 보존.
- 격리성은 단계가 있어 안전성과 성능을 상황에 맞게 고른다.
BEGIN·COMMIT·ROLLBACK을 직접 실행하고 격리 수준에 따라 동시 트랜잭션이 어떻게 달라지는지 확인하는 실습은 데이터베이스 트랙에서 회원가입 없이 무료로 할 수 있습니다.