ACID 속성

핵심 인사이트 (3줄 요약)

  1. 본질: ACID는 트랜잭션이 신뢰할 수 있는 작업을 수행하기 위해 보장해야 할 네 가지 핵심 속성(원자성, 일관성, 고립성, 영속성)의 약어다.
  2. 가치: ACID를 준수함으로써 다수의 사용자가 동시에 데이터를 조작해도 결과적으로는 정확한 데이터를 얻을 수 있으며, 시스템 장애가 발생해도 데이터의 무결성이 보존된다.
  3. 융합: CAP 정리와 함께 이해해야 하며, 분산 시스템에서는 일관성과 가용성 사이의 트레이드오프가 존재한다.

Ⅰ. 개요 및 필요성 (Context & Necessity)

개념 정의

ACID는 트랜잭션의 신뢰성을 보장하는 네 가지 속성의 약어로, 1983년 Andreas Reuter와 Theo Härder가 제안한 데이터베이스 트랜잭션 처리의 기본 원칙이다.

  • Atomicity (원자성): 트랜잭션은 하나의 원자적 작업으로 동작
  • Consistency (일관성): 트랜잭션前后数据库 상태가 유효
  • Isolation (고립성): 동시 실행 트랜잭션이 서로 영향을 주지 않음
  • Durability (영속성): 완료된 트랜잭션 결과는 영구적으로 보존

각 속성이 필요한 이유

ACID 네 가지 속성이 없다면 데이터베이스는 예측 불가능한 상태에 놓이게 된다. 그 이유를각 속성별로 살펴본다.

┌─────────────────────────────────────────────────────────────────────┐
│                    ACID 속성 부재로 인한 문제점                         │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   [원자성 부재]                                                     │
│   "계좌 A에서 100원 차감" 후 시스템关机 → 계좌 A만 차감된 상태!       │
│   → 잔액 불일치 발생                                                 │
│                                                                     │
│   [일관성 부재]                                                     │
│   제약조건 "잔액은 0 이상" 미적용 → 잔액 -500원 발생 가능!            │
│   → 비즈니스 규칙 위반                                                │
│                                                                     │
│   [고립성 부재]                                                     │
│   트랜잭션 A: 계좌 잔액 확인 → 1000원                               │
│   트랜잭션 B: 같은 계좌에서 500원 인출 → 잔액 500원                   │
│   트랜잭션 A: 1000 - 200원 = 800원 입금 → 실제 잔액 300원!           │
│   → 잘못된 계산 결과                                                 │
│                                                                     │
│   [영속성 부재]                                                     │
│   이체 완료 확인 후 시스템关机 → 변경 내용 유실!                     │
│   → 거래 성립 여부 불명확                                            │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 각 속성이 하나라도缺失되면 심각한 문제가 발생한다. 원자성이 없으면 작업의 일부만 적용되어 데이터 상태가 불완전해지고, 일관성이 없으면 제약조건이 깨져 잘못된 데이터가 저장될 수 있다. 고립성이 없으면 동시 작업이 서로 간섭하여 잘못된 결과가 도출되고, 영속성이 없으면 완료된 작업도 사라질 수 있다. ACID는 이러한 문제들을系統적으로 해결한다.

비유

ACID는 은행의 four major 안전장치와 같다. 원자성은 거래가 완전히 완료되거나 완전히 취소되거나 둘 중 하나만을 보장하고, 일관성은 거래 후 잔액이 논리적으로 유효한지 확인하며, 고립성은 동시에 거래가 발생해도 서로 충돌하지 않도록 하고, 영속성은 거래 완료 후 내역이 영구히 기록됨을 보장한다.

  • 📢 섹션 요약 비유: 화물을 선적할 때 화물이 모두 적재되거나(원자성), 화물 목록과 일치하거나(일관성), 다른 화물과 섞이지 않거나(고립성), 항해 후 화물이 목적지에 무사히 도착하거나(영속성)하는 보장 장치와 같습니다.

Ⅱ. 아키텍처 및 핵심 원리 (Deep Dive)

원자성 (Atomicity) 상세

원자성은 트랜잭션 내의 모든 操作이 하나로 묶여 동작하는 성질이다. 트랜잭션 내의 모든 操作이 성공하거나, 하나라도 실패하면 전체가 롤백된다.

┌─────────────────────────────────────────────────────────────────────┐
│                       원자성 동작 과정                                 │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   트랜잭션 T1: 계좌 A(1000원)에서 계좌 B(500원)로 200원 이체         │
│                                                                     │
│   ┌─────────────────────────────────────────────────────────────┐  │
│   │  정상 처리:                                                   │  │
│   │  T1: UPDATE 계좌 SET 잔액 = 800 WHERE 계좌ID = 'A'         │  │
│   │  T1: UPDATE 계좌 SET 잔액 = 700 WHERE 계좌ID = 'B'         │  │
│   │  T1: COMMIT → 계좌 A: 800원, 계좌 B: 700원 (합계 동일)      │  │
│   └─────────────────────────────────────────────────────────────┘  │
│                                                                     │
│   ┌─────────────────────────────────────────────────────────────┐  │
│   │  장애 발생 시 (A 차감 후 B 추가 전 시스템 장애):              │  │
│   │  T1: UPDATE 계좌 SET 잔액 = 800 WHERE 계좌ID = 'A'         │  │
│   │  [시스템 장애!]                                              │  │
│   │                                                              │  │
│   │  → 복구 시 Undo 로그에 따라 A를 1000원으로 롤백              │  │
│   │  → B는 변경된 적이 없으므로 불필요                             │  │
│   │  → 결과: 계좌 A: 1000원, 계좌 B: 500원 (원래 상태로)         │  │
│   └─────────────────────────────────────────────────────────────┘  │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 원자성의 핵심은 트랜잭션이 "전부 아니면 전무"으로 동작한다는 점이다. 계좌 A 차감이 성공한 후 시스템이 장애를 일으키면, 복구 메커니즘은 A의 변경분을 취소 (Undo)하여 원래 상태로 만든다. 이것이 가능한 이유는 DBMS가 모든 변경 전에 이전 값을 로그에 기록하기 때문이다. 만약 원자성이 없다면, A만 차감된 채로 시스템이 재시작되어 잔액이 불일치하게 된다.


일관성 (Consistency) 상세

일관성은 트랜잭션前后数据库 상태가 모든 제약조건, 무결성 규칙, 트리거를 만족하는 성질이다.

┌─────────────────────────────────────────────────────────────────────┐
│                       일관성 보장 예시                                 │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   [일관성 제약조건 정의]                                             │
│                                                                     │
│   CREATE TABLE 계좌 (                                                │
│       계좌ID VARCHAR(10) PRIMARY KEY,                                │
│       잔액 NUMBER CHECK (잔액 >= 0),  -- 잔액은 0 이상               │
│       등급 VARCHAR(1) CHECK (등급 IN ('A', 'B', 'C'))               │
│   );                                                                 │
│                                                                     │
│   트랜잭션 T1: 계좌 A(잔액=100)에서 150원 인출                        │
│                                                                     │
│   ① 잔액 확인: 100 >= 0 (현재)                                     │
│   ② 차감 시도: 100 - 150 = -50                                     │
│   ③ CHECK(잔액 >= 0) 검증 → -50 >= 0? FALSE!                       │
│   ④ → 트랜잭션 거부! (ROLLBACK)                                     │
│                                                                     │
│   ┌─────────────────────────────────────────────────────────────┐  │
│   │  결과: 일관성 유지!                                           │  │
│   │  • "잔액은 0 이상" 규칙 위반 → 변경 거부                     │  │
│   │  • 잔액은 여전히 100원                                        │  │
│   │  • 시스템은 항상 유효한 상태를 유지                           │  │
│   └─────────────────────────────────────────────────────────────┘  │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 일관성은 데이터베이스에 정의된 제약조건(CHECK, FOREIGN KEY, UNIQUE, NOT NULL 등)이 트랜잭션 후에 항상 만족되도록 보장하는 것이다. 위 예시에서 잔액이 -50이 되려는 순간 CHECK 제약조건이 이를 막는다. 일관성은 트랜잭션이/business 규칙을 위반하는 것을 시스템 수준에서防止한다. 개발자가 일관성을 직접 검증할 필요 없이, DBMS가 자동으로制約を執行한다.


고립성 (Isolation) 상세

고립성은 동시 실행되는 트랜잭션들이 서로 영향을 주지 않는 것처럼 동작하는 성질이다. 실제 동작 수준은 고립 수준 (Isolation Level)에 따라 달라진다.

┌─────────────────────────────────────────────────────────────────────┐
│                    고립성 위반 예시 (Dirty Read)                       │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   시간 | 트랜잭션 A (읽기)        | 트랜잭션 B (쓰기)                │
│   ───┼────────────────────────┼──────────────────────────          │
│   T1 | SELECT 잔액 → 1000원    |                               │
│   T2 |                        | UPDATE 잔액 = 500원              │
│   T3 |                        | ROLLBACK                        │
│   T4 | SELECT 잔액 → 500원!!  |                               │
│       │ (1000이 아닌 500!)     |                               │
│                                                                     │
│   ┌─────────────────────────────────────────────────────────────┐  │
│   │  문제: A가 B의未コミット 변경을 읽음 (Dirty Read)            │  │
│   │  → B가 롤백되면, A가 읽은 값은 존재하지 않는 것!             │  │
│   │  → A의 판단/작업이 잘못된 데이터에 기반하게 됨               │  │
│   └─────────────────────────────────────────────────────────────┘  │
│                                                                     │
│   [고립 수준별 동작]                                                │
│                                                                     │
│   READ UNCOMMITTED: Dirty Read 허용 (가장 낮은 고립)               │
│   READ COMMITTED:   커밋된 데이터만 읽기 (대부분의 DBMS 기본값)     │
│   REPEATABLE READ:  동일 트랜잭션에서 동일 읽기 결과 보장           │
│   SERIALIZABLE:     트랜잭션을 순차 실행한 것과 동일하게 동작       │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 고립성이 없으면 트랜잭션 A가 트랜잭션 B의 아직 롤백되지 않은 변경(Dirty Read)을 읽을 수 있다. B가 최종적으로 롤백되면, A가 읽고 사용한 데이터는 사실 존재하지 않는 것이 된다. 고립 수준은 이러한 문제를 어느 정도まで防止할지를 결정한다. READ COMMITTED는 커밋된 데이터만 읽도록 하여 Dirty Read를 방지하지만, NON-REPEATABLE READ(같은 트랜잭션에서 다시 읽을 때 값이 바뀜)는 허용한다. REPEATABLE READ는 한 트랜잭션에서 읽은 값을 보장하지만, Phantom Read(새로 나타난 행)는 허용한다. SERIALIZABLE은 가장 엄격하지만 성능 저하가 있다.


영속성 (Durability) 상세

영속성은 성공적으로 완료된 트랜잭션의 결과가 시스템 장애가 발생하더라도 영구적으로 보존되는 성질이다.

┌─────────────────────────────────────────────────────────────────────┐
│                    영속성 보장 메커니즘                               │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   [시스템 장애 시나리오]                                             │
│                                                                     │
│   T1: COMMIT 완료 (계좌 A → B 이체)                                 │
│   [시스템 전원 꺼짐!]                                                │
│   [시스템 재시작]                                                    │
│                                                                     │
│   ┌─────────────────────────────────────────────────────────────┐  │
│   │  로그 파일 검사를 통한 복구 과정:                               │  │
│   │                                                               │  │
│   │  1. COMMIT 로그 존재 확인 → T1은 완료된 트랜잭션             │  │
│   │  2. T1의 변경 내용 Redo 실행:                                 │  │
│   │     • 계좌 A: 1000 → 800                                     │  │
│   │     • 계좌 B: 500 → 700                                      │  │
│   │  3. 장애 직전 상태로 복구 완료!                               │  │
│   │  4. 사용자에게 "이체 완료" 확인 가능                           │  │
│   └─────────────────────────────────────────────────────────────┘  │
│                                                                     │
│   [WAL (Write-Ahead Logging) 순서]                                 │
│                                                                     │
│   ① Undo 정보 로그에 기록                                           │
│   ② Redo 정보 로그에 기록                                           │
│   ③ 로그를 디스크에 강제 기록 (fsync) ← 핵심!                       │
│   ④ 데이터 페이지를 디스크에 기록                                    │
│   ⑤ COMMIT 완료 응답                                              │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] 영속성 보장의 핵심은 COMMIT 완료 응답을 사용자에게 보내기 전에, 트랜잭션 로그를 디스크에 기록하는 것이다. 데이터 페이지는 버퍼 풀(메모리)에만 있을 수 있고, COMMIT 시점에 디스크 쓰기가 완료되지 않을 수 있다. 그러나 로그가 디스크에 기록되어 있으면, 장애 복구 시 해당 로그를 읽고 변경 내용을 재적용(Redo)할 수 있다. 이것이 RAID, SSD, 배터리 지원 디스크 контр처 등 다양한 복구 기술과 결합되어 영속성을 保证한다.

  • 📢 섹션 요약 비유: 항공사 예약 시스템에서 좌석을確定하고 티켓을發行받은 후 (COMMIT), 항공사 컴퓨터가 고장이 나도 예약 기록은 다른 서버에 보존되어 있어서 좌석이 확정된 것으로 유지되는 것과 같습니다.

Ⅲ. 융합 비교 및 다각도 분석

비교: RDBMS vs NoSQL에서의 ACID 지원

구분전통 RDBMSNoSQL (Eventual Consistency)
원자성완전 지원부분 지원 (단일 문서/키 수준)
일관성즉시 일관성 (Immediate Consistency)최종 일관성 (Eventual Consistency)
고립성MVCC, 2PL 등 완전 지원제한적 (파티션 방식)
영속성완전 지원약화될 수 있음 (메모리 기반)
트레이드오프성능보다 일관성 우선확장성·가용성 우선, 일관성 희생

NoSQL은 CAP 정리에 따라 가용성(A)과 일관성(C) 사이에서 가용성을 선택한 경우가 많다. 이는 "일관성이 없egen 아니라 최종적으로 일관되는" 모델을 의미한다.


CAP 정리와의 관계

CAP 정리는 분산 시스템에서 일관성(Consistency), 가용성(Availability), 네트워크 분할 내성(Partition Tolerance) 세 가지를 모두 동시에 보장할 수 없다는 정리다.

┌─────────────────────────────────────────────────────────────────────┐
│                    CAP 정리와 ACID의 관계                             │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│         C (일관성)                                                  │
│           /\\                                                       │
│          /  \\                                                       │
│         /    \\                                                      │
│        /      \\                                                     │
│       /   CA   \\                                                    │
│      /          \\                                                   │
│     /────────────\\                                                 │
│    P             A                                                  │
│  (분할 내성)    (가용성)                                             │
│                                                                     │
│   ┌─────────────────────────────────────────────────────────────┐  │
│   │  • CA (일관성+가용성): 전통적 RDBMS, 단일 노드               │  │
│   │  • CP (일관성+분할 내성): MongoDB, HBase, Redis             │  │
│   │  • AP (가용성+분할 내성): Cassandra, DynamoDB               │  │
│   │                                                             │  │
│   │  → 분산 환경에서는 P는 피할 수 없으므로 C vs A 선택!         │  │
│   └─────────────────────────────────────────────────────────────┘  │
│                                                                     │
│   ACID의 D (영속성)와 CAP의 P (분할 내성)는 직접적인 관련은 없지만,  │
│   영속성을 높이려면 디스크 I/O와 연결되어 있어 성능에 영향           │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘

[다이어그램 해설] CAP 정리는 분산 시스템에만 적용되는 이론이지만, 단일 노드 데이터베이스에서도参考할 점이 있다. P(네트워크 분할)가 없으면 CA를 동시에 달성할 수 있지만, 실제로는 네트워크 장애가 발생할 수 있으므로 분산 시스템 설계 시에는 C와 A 사이의 선택이 필요하다.金融システムのように一貫性が重要な場合はCPを选择し、コンテンツ配信のように可用性が重要な場合はAPを選択する.

  • 📢 섹션 요약 비유: 세 명의 친구가 전화를해서 같은 이야기를 동시에 전해야 하는데, 전화선이 끊어지면 (분할) "같은 이야기를 전할 수 없게 된다"는 CAP 정리의 비유처럼, 분산 컴퓨터에서도 모든 것이 동시에 완벽하게 일치하는 것은 불가능합니다.

Ⅳ. 실무 적용 및 기술사적 판단

실무 시나리오

  1. 시나리오 — 금융 기관의 이체 거래: ACID의 모든 속성이 필수적이다. 원자성으로 이체 중 장애 시 전체 취소, 일관성으로 잔액 마이너스 방지, 고립성으로 동시 이체 거래 처리, 영속성으로 거래 완료 후 기록 보존이 각각 필요하다.

  2. 시나리오 — SNS의 좋아요 수 갱신: 이 경우 완전한 ACID 대신 eventual consistency로 충분한 경우도 있다. 좋아요 수가 약간 지연되어 갱신되어도 사용자에게 큰 문제가 되지 않는다.

도입 체크리스트

  • 기술적: 업무의 일관성 요구 수준에 맞는 격리 수준 (Isolation Level)을 설정했는가? 트랜잭션 로그의 성장 관리와 백업 전략을 수립했는가?
  • 운영·보안적: 장기 트랜잭션의 모니터링과 조기 경고 체계를 갖추었는가? 장애 복구 테스트를 정기적으로 수행하고 있는가?

안티패턴

  • ACID 미준수: 금융 거래에서 일관성을 희생하면 잔액 계산 오류가 발생할 수 있다.

  • 과도한 ACID: 읽기 전용 대시보드 查询에까지 높은 격리 수준을 적용하면 불필요한 성능 저하가 발생한다.

  • 📢 섹션 요약 비유: 모든 건물의 내진 설계를 동일하게 하면 비용이 너무 많이 드는 것처럼, 모든 데이터 작업에 완전한 ACID를 적용하면 성능이 저하됩니다. 업무의 중요도에 따라 적절한 수준을 선택하는 것이 핵심입니다.


Ⅴ. 기대효과 및 결론

정량/정성 기대효과

구분ACID 미준수 환경ACID 완전 준수개선 효과
정량데이터 불일치율 5~30%0% 불일치신뢰성 100% 향상
정량장애 시 복구율 50~70%99.99% 복구복구 신뢰도大幅 향상
정성감사/법적 분쟁 위험 높음규정 준수의しやすさ컴플라이언스大幅 향상

미래 전망

  • NewSQL: 분산 환경에서도 ACID를 지원하는 새로운 데이터베이스 (CockroachDB, TiDB, Google Spanner)
  • Hybrid 아키텍처: 중요 거래는 ACID RDBMS, 일반 조회는 NoSQL로 분리
┌─────────────────────────────────────────────────────────────────────┐
│                    ACID 기술의 진화                                  │
├─────────────────────────────────────────────────────────────────────┤
│                                                                     │
│   1980s-2000s: 단일 RDBMS의 ACID (Oracle, DB2)                     │
│       │                                                              │
│       ▼                                                              │
│   2000s-2010s: NoSQL의 BASE (Basically Available, Soft state,      │
│                        Eventual consistency)                        │
│       │                                                              │
│       ▼                                                              │
│   2010s~: NewSQL의 분산 ACID (CockroachDB, TiDB, Spanner)          │
│                                                                     │
│   핵심 과제: 확장성과 일관성을 동시에 달성하는 것                      │
│                                                                     │
└─────────────────────────────────────────────────────────────────────┘
  • 📢 섹션 요약 비유: 옛날에는 한 사람이 모든 장부를 직접 처리했지만 (ACID), 회사가 커지자 사람이 많아져서 분산해서 처리하게 되었습니다 (NoSQL BASE). 하지만 서로의 기록이 안 맞는 문제가 생겨서, 다시 분산되어도 전체의 일관성을 맞추는 방법을 찾고 있습니다 (NewSQL).

📌 관련 개념 맵 (Knowledge Graph)

개념 명칭관계 및 시너지 설명
트랜잭션ACID 속성을 보장하는 논리적 작업 단위이다.
MVCCMulti-Version Concurrency Control로, 잠금 없이 고른 읽기를 가능하게 하는 기법이다.
2PCTwo-Phase Commit으로, 분산 트랜잭션에서 원자성을 보장하는 프로토콜이다.
CAP 정리분산 시스템에서 일관성, 가용성, 분할 내성 중 두 가지만 동시에 보장 가능하다는 이론이다.
BASENoSQL에서 사용되는 일관성 모델로, Basically Available, Soft state, Eventual consistency의 약어다.

👶 어린이를 위한 3줄 비유 설명

  1. ACID는 은행 금고의 네 가지 열쇠예요. 네 개를 모두 맞춰야 금고가 열리고 (원자성), 안에 있는 물건이 모두 알맞아야 하고 (일관성), 다른 사람이 동시에 열쇠를 돌려도 서로 안 충돌하고 (고립성), 한 번 열린 금고는 계속 열려 있어야 합니다 (영속성).
  2. 만약 네 열쇠 중 하나라도 빠지면 금고가 제대로 작동하지 않아요.
  3. 컴퓨터도 데이터를 다루면서 이 네 가지를 다 지켜야 우리가 사용하는 앱이 정확하고 안전하게 작동하는 거예요!