ACID

데이터베이스 관리 시스템(DBMS)에서 ACID는 트랜잭션의 신뢰성과 일관성을 정의하는 네 가지 주요 특성.
ACID는 Atomicity(원자성), Consistency(일관성), Isolation(격리성), Durability(지속성)의 약자

ACID의 중요성:

  1. 데이터 무결성 유지
  2. 트랜잭션의 신뢰성 보장
  3. 동시성 제어
  4. 시스템 장애 복구
  5. 비즈니스 규칙 및 관계형 무결성 강화

장점:

  • 데이터 일관성 유지
  • 트랜잭션 무결성 보장
  • 내결함성 및 복구 기능 제공
  • 동시성 제어 가능

단점:

  • 처리 오버헤드로 인한 성능 저하
  • 대용량 OLTP 시스템에서의 성능 문제
  • 제한적인 잠금으로 인한 확장성 제한

Atomicity (원자성)

원자성은 트랜잭션이 단일의 불가분한 작업 단위로 취급되어야 함을 의미합니다.

  • 트랜잭션의 모든 작업이 성공적으로 완료되거나 전혀 실행되지 않아야 합니다.
  • 트랜잭션 중 일부가 실패하면 전체 트랜잭션이 롤백되어 원래 상태로 돌아갑니다.
  • 이는 데이터의 일관성과 무결성을 보장합니다.
1
2
3
4
BEGIN TRANSACTION;
    UPDATE accounts SET balance = balance - 1000 WHERE account_id = 'sender';
    UPDATE accounts SET balance = balance + 1000 WHERE account_id = 'receiver';
COMMIT;

이 송금 트랜잭션에서 첫 번째 UPDATE는 성공했지만 두 번째 UPDATE가 실패한다면, 원자성 때문에 첫 번째 UPDATE도 롤백된다.
마치 아무 일도 없었던 것처럼 모든 변경사항이 취소되는 것.
이는 “all or nothing” 원칙이라고도 부른다.

Consistency (일관성)

일관성은 트랜잭션이 데이터베이스를 한 일관된 상태에서 다른 일관된 상태로 변경해야 함을 의미합니다.

  • 트랜잭션 실행 전후에 데이터베이스가 일관된 상태를 유지해야 합니다.
  • 고유 키, 외래 키 등의 제약 조건이 유지되어야 합니다.
  • 이는 데이터의 정확성과 유효성을 보장합니다.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
BEGIN TRANSACTION;
    -- 잔고가 800원인 계좌에서 1000원을 출금하려는 경우
    UPDATE accounts 
    SET balance = balance - 1000 
    WHERE account_id = 'user1'
    AND balance >= 1000; -- 제약조건 추가
    
    IF ROW_COUNT() = 0 THEN
        ROLLBACK;
        RAISE EXCEPTION '잔액이 부족합니다';
    END IF;
COMMIT;

예를 들어, 계좌 잔고가 항상 0 이상이어야 한다는 규칙이 있다면, 제약조건에 위배되는 트랜잭션은 실행되지 않으며, 데이터베이스의 일관성이 유지된다.

Isolation (격리성)

격리성은 여러 트랜잭션이 동시에 실행될 때 서로 간섭하지 않고 독립적으로 실행되어야 함을 의미합니다.

  • 각 트랜잭션은 다른 트랜잭션으로부터 격리되어 실행됩니다.
  • 이는 더티 리드(dirty read), 반복 불가능한 읽기(non-repeatable read), 팬텀 읽기(phantom read) 등의 문제를 방지합니다.
  • 트랜잭션의 동시성을 관리하여 데이터의 일관성을 유지합니다.

격리 수준

  1. READ UNCOMMITTED (가장 낮은 격리 수준)
    다른 트랜잭션의 커밋되지 않은 변경사항도 볼 수 있다.
    이로 인해 “Dirty Read” 문제가 발생할 수 있습니다.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    
    -- Transaction 1
    BEGIN;
    UPDATE products SET price = 15000 WHERE id = 1;
    -- 아직 COMMIT하지 않음
    
    -- Transaction 2 (READ UNCOMMITTED에서)
    SELECT price FROM products WHERE id = 1;
    -- 15000을 읽음 (Dirty Read)
    
    -- Transaction 1
    ROLLBACK;
    -- Transaction 2는 잘못된 가격을 읽은 상태
    
  2. READ COMMITTED
    커밋된 데이터만 읽을 수 있지만, “Non-repeatable Read” 문제가 발생할 수 있다.

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    
    -- Transaction 1
    BEGIN;
    SELECT price FROM products WHERE id = 1; -- 10000원 읽음
    
    -- Transaction 2
    UPDATE products SET price = 15000 WHERE id = 1;
    COMMIT;
    
    -- Transaction 1
    SELECT price FROM products WHERE id = 1; -- 15000원 읽음
    -- 같은 트랜잭션 내에서 다른 결과를 얻음
    
  3. REPEATABLE READ
    트랜잭션 내에서 같은 쿼리는 항상 같은 결과를 반환하지만, “Phantom Read” 문제가 발생할 수 있다.

  4. SERIALIZABLE (가장 높은 격리 수준)
    트랜잭션들이 순차적으로 실행되는 것처럼 동작하여 모든 동시성 문제를 방지.

Durability (지속성)

지속성은 트랜잭션이 성공적으로 완료된 후 그 결과가 영구적으로 저장되어야 함을 의미합니다.

  • 시스템 장애나 전원 손실 등의 상황에서도 트랜잭션의 결과가 유지되어야 합니다.
  • 이는 주로 로그 파일을 사용하여 구현됩니다. 변경 사항을 먼저 로그 파일에 기록한 후 데이터베이스에 반영합니다.
1
2
3
4
5
6
-- 트랜잭션 로그를 통한 지속성 보장
BEGIN;
UPDATE accounts SET balance = balance - 1000 WHERE id = 1;
-- 이 시점에서 변경사항이 트랜잭션 로그에 기록됨
COMMIT;
-- 시스템이 갑자기 중단되더라도, 재시작 시 로그를 통해 변경사항 복구 가능

ACID 특성의 실제 적용

예를 들어, 온라인 쇼핑몰에서 상품 구매 처리를 살펴보자.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
BEGIN TRANSACTION;
    -- 1. 재고 확인 및 감소
    UPDATE products 
    SET stock = stock - 1
    WHERE id = 123 AND stock > 0;
    
    IF ROW_COUNT() = 0 THEN
        ROLLBACK;
        RAISE EXCEPTION '재고 부족';
    END IF;
    
    -- 2. 주문 생성
    INSERT INTO orders (product_id, user_id, quantity, total_price)
    VALUES (123, 456, 1, 50000);
    
    -- 3. 결제 처리
    UPDATE user_accounts 
    SET balance = balance - 50000
    WHERE user_id = 456 AND balance >= 50000;
    
    IF ROW_COUNT() = 0 THEN
        ROLLBACK;
        RAISE EXCEPTION '잔액 부족';
    END IF;
    
COMMIT;

이 트랜잭션에서:

  • Atomicity: 모든 단계가 성공적으로 완료되거나, 전체가 취소된다.
  • Consistency: 재고와 잔액이 음수가 되지 않도록 보장한다.
  • Isolation: 다른 구매 트랜잭션과 충돌하지 않도록 한다.
  • Durability: 구매 완료 후 시스템이 중단되어도 데이터는 보존된다.

참고 및 출처