Database
ACID
ACID 네 가지 특성과 실무에서 흔히 놓치는 지점을 간결하게 정리합니다.
ACID
ACID 정의
- Atomicity: 트랜잭션은 전부 성공하거나 전부 실패해야 합니다.
- Consistency: 트랜잭션 전후로 제약조건과 데이터 규칙이 유지되어야 합니다.
- Isolation: 동시에 실행되는 트랜잭션 간 간섭이 제어되어야 합니다.
- Durability: 커밋된 결과는 장애 이후에도 보존되어야 합니다.
ACID를 실제로 깨뜨리는 원인
- 애플리케이션에서 트랜잭션 경계를 너무 넓게 잡아 락 경합 증가.
- 격리수준 이해 없이 기본값 사용 후 팬텀 리드/갱신 손실 발생.
- DB 커밋 전에 외부 시스템(메시지 발행, 캐시 갱신)부터 수행.
- 장애 복구 절차가 없어 durability를 백업에만 의존.
격리수준 선택 기준(요약)
READ COMMITTED: 일반 OLTP 기본 선택.REPEATABLE READ: 동일 트랜잭션 내 조회 일관성이 중요할 때.SERIALIZABLE: 충돌 허용이 매우 낮고 처리량 희생 가능할 때.
분산 환경에서의 확장
단일 DB 트랜잭션으로 끝나지 않으면 보통 두 가지를 고려합니다.
- 2PC/XA: 강한 일관성 우선, 운영 복잡도와 지연 증가.
- Saga: 보상 트랜잭션 기반, 최종 일관성 모델.
정답은 하나가 아니라, 도메인의 실패 허용치에 따라 선택합니다.
실무 체크포인트
- 트랜잭션 안에서는 DB 변경 외 작업을 최소화합니다.
- 교착상태 재시도 정책(횟수/백오프)을 명시합니다.
- "커밋 후 이벤트 발행" 패턴(outbox 등)으로 정합성을 맞춥니다.
- 백업 복구 리허설 없이는 durability를 만족했다고 보기 어렵습니다.
요약
ACID는 이론이 아니라 운영 계약입니다. 트랜잭션 경계, 격리수준, 장애 복구 시나리오를 코드와 문서로 함께 관리해야 실제 품질이 유지됩니다.