노트

ACID

ACID (Atomicity, Consistency, Isolation, Durability)

백엔드#db · 연결된 개념 9개

쉽게 말하면

ACID는 계좌 이체를 믿고 맡길 수 있게 해 주는 네 가지 약속이에요. 반만 처리되는 일이 없고, 규칙이 깨지지 않고, 다른 이체와 섞이지 않고, 끝난 건 정전이 나도 남아요.

비유가 깨지는 곳 실제로는 '다른 이체와 섞이지 않는다'를 완벽하게 지키면 느려져요. 그래서 DB는 격리 수준을 골라 안전과 동시성을 맞바꿔요.

ACID는 DB 트랜잭션이 보장해야 할 네 가지 성질이다. 트랜잭션은 "계좌 이체의 출금 + 입금"처럼 함께 성공하거나 함께 실패해야 하는 논리적 작업 단위다.

  • Atomicity(원자성): 트랜잭션 안의 작업은 전부 반영되거나 전혀 반영되지 않는다. "출금은 됐는데 입금은 안 됨"이 남지 않는다
  • Consistency(일관성): 트랜잭션 전후로 DB가 모든 제약 조건을 만족하는 유효한 상태를 유지한다(데이터 무결성)
  • Isolation(격리성): 동시에 도는 트랜잭션들이 서로의 중간 상태를 보지 않는다. 혼자 실행되는 것처럼 보여야 한다
  • Durability(지속성): 커밋된 결과는 정전이 나도 남는다. 보통 WAL(Write-Ahead Log)에 먼저 기록해 보장한다

격리 수준(isolation level)

완벽한 격리는 비싸서, DB는 단계를 나눠 고르게 한다.

수준막는 것
Read Uncommitted거의 없음
Read Committed커밋 안 된 값 읽기(dirty read)
Repeatable Read+ 같은 행을 다시 읽을 때 값이 바뀜(non-repeatable read)
Serializable+ 새 행이 끼어드는 팬텀(phantom read) 등 모든 이상

격리를 강하게 할수록 안전하지만 동시성은 떨어진다. PostgreSQL·Oracle의 기본은 Read Committed, MySQL InnoDB의 기본은 Repeatable Read다.

무결성과의 관계

무결성이 지키려는 상태라면 ACID는 그 상태를 지키는 방법이다. C가 제약 유지를 직접 맡고, A·I·D는 동시성과 장애 상황에서도 그 일관성이 깨지지 않게 받친다. 스프링에서 트랜잭션 경계를 긋는 방법은 @Transactional을 본다.

분산 환경에서는

서로 다른 저장소를 한 트랜잭션으로 묶을 수 없으면 ACID 대신 최종 일관성(BASE: Basically Available, Soft state, Eventual consistency)을 받아들이고, 트랜잭셔널 아웃박스 패턴 같은 패턴으로 틈을 메운다.

출처: PostgreSQL 문서: Transaction Isolation

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 데이터베이스 다중화

    같은 데이터를 여러 DB 서버에 복제해 두는 것. 가장 흔한 형태는 원본을 가진 주(Primary) 서버가 쓰기를 받고, 사본을 받는 부(Replica) 서버들이 읽기를 나눠 맡는 구조다.

  • DB 인덱스와 트레이드오프

    DB 인덱스는 특정 컬럼 값으로 행을 빨리 찾도록 테이블 옆에 따로 유지하는 보조 자료구조(auxiliary data structure)다. 관계형 DB의 기본 인덱스는 정렬된 균형 트리(B-tree 계열)라서, 전체를 훑지 않고 트리를 따라 내려가 원하는 행에 닿는다.

  • 의존성 역전 원칙

    고수준 모듈(업무 규칙)이 저수준 모듈(데이터베이스(DB), HTTP(Hypertext Transfer Protocol) 클라이언트 같은 세부 구현)에 직접 의존하지 않고, 둘 다 추상화에 의존해야 한다는 원칙. 의존 방향이 "업무 → 세부"에서 "세부 → 추상화 ← 업무"로 뒤집힌다.

  • CDC (변경 데이터 캡처)

    CDC(Change Data Capture)는 데이터베이스의 변경 로그를 읽어 "어떤 행이 어떻게 바뀌었다"는 이벤트로 바꿔 내보내는 기법이다. 애플리케이션 코드가 아니라 DB가 이미 남기는 기록에서 변경을 뽑아내므로, 다른 저장소와 동기화할 때 누락 위험이 가장 낮다.

  • 로컬 퍼스트 아키텍처

    클라이언트 기기의 로컬 데이터를 진실의 원천(Source of Truth)으로 삼고, 서버는 동기화와 백업을 맡는 설계 방식. 전통적인 "서버가 원천, 클라이언트는 요청해서 그린다" 구조를 뒤집어 로컬 DB → UI 렌더링 → 백그라운드 동기화 순서로 흐른다.

보기 옵션