IT이야기/데이터베이스

ACID 특성: 데이터베이스 트랜잭션의 무결성을 보장하는 핵심 원칙

Chiba-in 2025. 2. 28. 15:00

🔹 ACID 특성이란?

1. ACID의 정의

ACID는 데이터베이스 트랜잭션(Transaction)이 일관성과 신뢰성을 유지하도록 보장하는 4가지 핵심 속성(Atomicity, Consistency, Isolation, Durability)을 의미합니다.
ACID 원칙은 데이터베이스가 장애(시스템 충돌, 네트워크 오류 등) 발생 시에도 데이터의 무결성을 유지할 수 있도록 보장합니다.

ACID의 4가지 핵심 원칙:

  • 원자성(Atomicity): 트랜잭션은 완전히 수행되거나 전혀 수행되지 않아야 함
  • 일관성(Consistency): 트랜잭션 실행 후 데이터가 항상 일관된 상태를 유지해야 함
  • 격리성(Isolation): 동시에 실행되는 트랜잭션이 서로 간섭하지 않도록 보장
  • 지속성(Durability): 트랜잭션이 완료되면 변경 사항이 영구적으로 저장되어야 함

📌 관계형 데이터베이스(RDBMS)는 ACID 속성을 준수하여 데이터의 신뢰성과 무결성을 보장함


🔹 ACID의 4가지 원칙 상세 설명

1. 원자성(Atomicity) – "All or Nothing"

  • 트랜잭션 내의 모든 작업이 성공해야 트랜잭션이 완료되며, 하나라도 실패하면 모든 변경 사항이 롤백(Rollback)되어야 함
  • 트랜잭션이 중간에 실패하더라도 데이터베이스 상태는 변경되지 않음

✔️ 원자성 예제 (은행 계좌 이체 트랜잭션)

BEGIN TRANSACTION;
UPDATE Accounts SET Balance = Balance - 500 WHERE AccountID = 1001;
UPDATE Accounts SET Balance = Balance + 500 WHERE AccountID = 2001;
COMMIT;  -- 모든 작업이 성공하면 트랜잭션 완료

📌 만약 두 번째 UPDATE 문이 실패하면, 첫 번째 UPDATE도 롤백되어야 함

✔️ 트랜잭션 실패 시 롤백 예제

BEGIN TRANSACTION;
UPDATE Accounts SET Balance = Balance - 500 WHERE AccountID = 1001;
-- 네트워크 오류 발생
ROLLBACK;  -- 첫 번째 UPDATE도 취소됨

📌 원자성 보장을 위해 COMMIT 전까지는 트랜잭션이 확정되지 않음


2. 일관성(Consistency) – "일관된 데이터 상태 유지"

  • 트랜잭션이 실행되기 전과 후의 데이터가 항상 정해진 규칙을 따라야 함
  • 외래 키(Foreign Key) 제약 조건, UNIQUE 제약 조건 등을 준수해야 함

✔️ 일관성 유지 예제

CREATE TABLE Orders (
    OrderID INT PRIMARY KEY,
    CustomerID INT,
    OrderDate DATE,
    FOREIGN KEY (CustomerID) REFERENCES Customers(CustomerID)
);

📌 Customers 테이블에 존재하지 않는 CustomerID를 Orders 테이블에 삽입하려 하면 오류 발생 → 일관성 유지

✔️ 잘못된 데이터 삽입 (오류 발생!)

INSERT INTO Orders (OrderID, CustomerID, OrderDate)  
VALUES (101, 999, '2024-02-20');  -- Customers 테이블에 CustomerID 999 없음 ❌ 오류 발생!

📌 트랜잭션 수행 후에도 데이터베이스는 항상 유효한 상태를 유지해야 함


3. 격리성(Isolation) – "동시성 제어"

  • 여러 트랜잭션이 동시에 실행될 때, 서로 간섭하지 않도록 보장해야 함
  • 격리 수준(Isolation Level)에 따라 동시 실행 시의 데이터 충돌 방지 정도가 다름

✔️ 격리성 문제 해결을 위한 SQL 트랜잭션 격리 수준

SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

📌 격리 수준을 설정하면, 특정 트랜잭션이 완료될 때까지 다른 트랜잭션이 해당 데이터를 읽지 못하도록 조정 가능

✔️ 격리성 문제 발생 예제 (Dirty Read)

BEGIN TRANSACTION;
UPDATE Accounts SET Balance = Balance - 500 WHERE AccountID = 1001;
-- 아직 COMMIT을 하지 않은 상태에서 다른 트랜잭션이 데이터를 읽으면 문제 발생

📌 트랜잭션이 완료되지 않았는데 다른 트랜잭션이 이를 읽으면 데이터 정합성 문제 발생 가능 → 격리 수준을 통해 방지 가능


4. 지속성(Durability) – "트랜잭션 완료 후 데이터 보장"

  • 트랜잭션이 성공적으로 완료되면, 데이터 변경 사항이 영구적으로 저장되어야 함
  • 시스템 장애(전원 꺼짐, 네트워크 오류) 발생 후에도 데이터가 유지되어야 함

✔️ 트랜잭션 완료 후 데이터 영구 저장

COMMIT;

📌 COMMIT이 실행되면 변경된 데이터는 영구적으로 데이터베이스에 저장됨

✔️ 데이터 영구 저장을 위한 로그(Write-Ahead Logging, WAL) 기법 사용

  • 데이터를 데이터베이스에 저장하기 전에 로그 파일에 먼저 기록하여 장애 발생 시 복구 가능

📌 트랜잭션이 완료된 후에도 데이터가 유지되는지 보장하는 것이 지속성의 핵심


🔹 ACID를 준수하는 데이터베이스 시스템 예제

데이터베이스 ACID 준수 여부
MySQL (InnoDB) ✅ 완전한 ACID 지원
PostgreSQL ✅ 완전한 ACID 지원
Oracle Database ✅ 완전한 ACID 지원
MongoDB (NoSQL) ❌ 기본적으로 ACID 보장 X, 트랜잭션 사용 시 지원
Redis (In-Memory) ❌ ACID 보장 X, 데이터 휘발 가능

📌 관계형 데이터베이스(RDBMS)는 기본적으로 ACID를 준수하지만, 일부 NoSQL 데이터베이스는 성능을 위해 일부 속성을 완화함


📌 결론

ACID 특성은 데이터베이스 트랜잭션에서 데이터의 무결성을 보장하는 4가지 원칙(Atomicity, Consistency, Isolation, Durability)이다.
관계형 데이터베이스(RDBMS)는 ACID 원칙을 엄격하게 준수하여 데이터 신뢰성을 유지한다.
원자성은 트랜잭션이 "전부 실행되거나 전혀 실행되지 않음"을 보장하며, 일관성은 데이터 무결성을 유지한다.
격리성은 동시 실행되는 트랜잭션이 서로 간섭하지 않도록 하며, 지속성은 트랜잭션 완료 후 데이터가 영구적으로 저장됨을 보장한다.
전자상거래, 금융, 의료 시스템 등 높은 신뢰성이 요구되는 분야에서는 ACID 특성을 필수적으로 고려해야 한다.