데이터베이스 트랜잭션의 정보 일관성(Information Consistency)을 보장하기 위한 4가지 속성인 ACID(원자성, 일관성, 격리성, 지속성)를 설명함.
원자성(Atomicity)은 트랜잭션이 완전히 실행되거나 전혀 실행되지 않음을 보장함.
일관성(Consistency)은 트랜잭션이 데이터베이스의 유효성 규칙을 위반하지 않도록 함.
격리성(Isolation)은 동시 트랜잭션이 서로 방해하지 않도록 보장함.
지속성(Durability)은 트랜잭션이 완료되면 시스템 장애에도 영구적으로 저장됨을 의미함.
ACID는 1983년 Andreas Reuter와 Theo Härder가 제안한 데이터베이스 트랜잭션의 핵심 속성으로, 데이터 무결성(Data Integrity)과 신뢰성(Reliability) 확보를 목표로 함.
금융 거래와 같이 데이터 일관성(Data Consistency)이 극도로 중요한 분야에서 그 중요성이 부각됨.
관계형 데이터베이스(SQL)는 물론, MongoDB와 같은 일부 NoSQL 데이터베이스에서도 부분적으로 채택하며 트랜잭션 보장 범위 확대 추세.
ACID 준수는 데이터 손실이나 불일치로 인한 심각한 문제를 예방하는 기본적인 안전장치(Fundamental Safeguard) 역할을 수행함.
원자성(Atomicity)은 트랜잭션 내의 모든 연산이 하나의 논리적 단위(Single Logical Unit)로 취급되어, 성공 시 전부 반영되고 실패 시엔 어떠한 변경도 적용되지 않음(No Partial Execution)을 보장함.
예를 들어, 계좌 이체 시 출금과 입금 연산이 모두 성공하거나, 둘 다 실패해야 함.
부분적으로만 실행될 경우 데이터 불일치(Data Inconsistency)를 야기하므로, '모두 실행되거나 아무것도 실행되지 않음(All or Nothing)' 원칙 준수가 필수적임.
PostgreSQL의 `BEGIN`, `COMMIT`, `ROLLBACK` 명령어를 통해 트랜잭션의 원자성을 명시적으로 제어할 수 있음.
일관성(Consistency)은 트랜잭션 실행 전후에 데이터베이스가 정의된 제약 조건(Defined Constraints) 및 규칙을 항상 만족하도록 보장하는 것을 의미함.
외래 키(Foreign Key) 제약 조건은 참조 무결성(Referential Integrity)을 유지하고, `CHECK` 제약 조건은 특정 컬럼 값의 유효 범위(Valid Range)를 강제함.
예시: `saldo >= 0` 제약 조건은 계좌 잔액이 음수가 되는 것을 방지하여 비즈니스 규칙(Business Rules) 준수를 보장함.
데이터베이스 레벨에서의 제약 조건은 애플리케이션 로직 오류로 인한 데이터 불일치를 효과적으로 차단함.
격리성(Isolation)은 여러 트랜잭션이 동시에 실행될 때, 각 트랜잭션이 마치 독립적인 환경(Independent Environment)에서 실행되는 것처럼 서로 영향을 주지 않도록 보장하는 속성임.
이를 통해 동시성 문제(Concurrency Issues)인 읽기 스팬(Read Skew), 쓰기 스팬(Write Skew) 등을 방지함.
PostgreSQL은 트랜잭션 격리 수준(Transaction Isolation Levels)을 제공하며, 기본적으로 커밋되지 않은 데이터(Uncommitted Data)를 읽지 못하도록(Read Uncommitted 방지) 하여 일관성을 높임.
두 개의 동시 트랜잭션이 서로의 중간 상태를 보지 못하게 함으로써 데이터의 논리적 흐름(Logical Data Flow)을 유지함.
지속성(Durability)은 트랜잭션이 성공적으로 커밋된 후에는, 시스템 장애(System Failure) 발생 시에도 데이터가 영구적으로 보존됨을 보장하는 속성임.
PostgreSQL의 WAL(Write-Ahead Logging) 메커니즘은 트랜잭션 로그를 먼저 디스크에 기록한 후 실제 데이터 변경을 수행하여 데이터 복구(Data Recovery) 능력을 제공함.
즉, 정전이나 시스템 충돌 발생 시에도 WAL 로그를 기반으로 최종 커밋된 상태로 복원 가능함.
이는 데이터베이스의 영속성(Persistence)을 보장하는 핵심 기술임.