Featured image of post ACID

ACID

트랜잭션 4대 원칙

📌개요

데이터베이스나 분산 시스템에서 트랜잭션은 안정성을 보장하는 핵심 개념이다. 특히 ACID(원자성, 일관성, 고립성, 지속성) 속성은 신뢰할 수 있는 데이터 처리를 위한 기본 토대다.

이번 글에서는 ACID 각각의 속성이 보장되지 않을 때 어떤 문제들이 발생할 수 있는지 예시와 일반적인 해결책을 간단히 알아본다.

📌내용

Atomicity - 원자성

모든 작업이 수행되거나, 아무것도 수행되지 않아야 한다.

원자성이 깨지면, 하나의 트랜잭션 안에서 일부 작업만 처리되고 나머지가 실패한 상태가 될 수 있다.

  • 예시: A → B로 계좌 이체 중 A 계좌에서 출금은 됐지만 B 계좌로 입금이 되기 전 장애가 발생한 경우 → 금액 손실.
  • 문제점: 시스템 상태가 불완전하게 갱신되어 데이터 손실 가능.
  • 해결 방안:
    • DBMS가 제공하는 트랜잭션 롤백(Rollback) 메커니즘 사용.
    • try-catch를 통해 예외 발생 시 rollback() 호출하도록 처리.
      1
      2
      3
      4
      5
      6
      7
      8
      
      try {
          connection.setAutoCommit(false);
          withdraw(fromAccount);
          deposit(toAccount);
          connection.commit();
      } catch (Exception e) {
          connection.rollback(); // 전체 트랜잭션이 되돌아감
      }
      

Consistency - 일관성

트랜잭션 전후의 데이터 상태는 항상 시스템 규칙을 만족해야 한다.

일관성은 데이터베이스에 정의된 제약 조건, 외래키, 트리거, 비즈니스 규칙 등이 항상 유지되어야 한다는 의미다.

  • 예시: 주문 시 존재하지 않는 상품 ID가 참조되거나, 재고가 음수가 되는 경우.
  • 문제점: 무결성이 깨진 데이터가 DB에 저장될 수 있음.
  • 해결 방안:
    • DB 레벨: 외래 키, 유일성 제약, CHECK, NOT NULL 등의 제약 조건 설정
    • 애플리케이션 레벨: 추가적인 비즈니스 유효성 검사 코드 구현
Warning

단, 일관성은 트랜잭션이 성공적으로 끝났을 경우에만 보장된다. 실패한 트랜잭션은 원자성과 함께 롤백되어 무결성을 해치지 않음.

Isolation - 고립성

각 트랜잭션은 서로 독립적으로 실행돼야 한다.

고립성이 깨지면 동시에 실행 중인 트랜잭션들이 서로 영향을 주며 비정상적인 데이터가 조회되거나 저장될 수 있다.

  • 주요 문제 유형:
문제설명예시
Dirty Read다른 트랜잭션이 아직 커밋하지 않은 데이터를 읽음B가 업데이트 중인 데이터를 A가 미리 읽음
Non-repeatable Read같은 조건으로 두 번 조회했는데 결과가 달라짐A가 한 사용자의 나이를 두 번 조회하는 사이 B가 그 값을 수정
Phantom Read같은 조건으로 조회했는데 행 개수가 달라짐A가 “나이 ≥ 30” 조건으로 조회한 후 B가 새로운 30세 사용자를 삽입
  • 격리 수준 비교 (ANSI SQL 기준):
수준보장 범위발생 가능한 문제
READ UNCOMMITTED아무것도 보장 안 됨Dirty Read, Non-repeatable Read, Phantom Read
READ COMMITTED커밋된 데이터만 읽음Non-repeatable Read, Phantom Read
REPEATABLE READ동일 쿼리 결과 동일Phantom Read
SERIALIZABLE가장 강력, 완전한 고립성능 저하 가능성
  • 해결 방안:
    • DB 격리 수준을 적절히 설정 (성능 vs 고립성 트레이드오프 고려)
    • 비즈니스 중요도에 따라 적용 수준을 유연하게 구성

Durability - 지속성

트랜잭션이 커밋되면, 그 결과는 영구히 저장되어야 한다.

지속성이 보장되지 않으면, 트랜잭션이 커밋되었더라도 시스템 장애 발생 시 데이터가 유실될 수 있다.

  • 예시: 사용자가 결제를 완료했는데, 직후 서버 다운으로 주문 내역이 저장되지 않음 → 신뢰성 손상
  • 문제점: 커밋 이후에도 데이터 유실 가능 → 사용자 신뢰도 하락
  • 해결 방안:
    • DBMS의 WAL(Write-Ahead Logging): 로그를 먼저 디스크에 기록하고 나서 커밋 처리
    • RAID, 이중화 스토리지, 디스크 플러시(sync) 전략
    • 분산 시스템에서는 Replication, Quorum 기반의 커밋 방식도 사용됨

🎯결론

트랜잭션의 ACID 속성은 단순한 개념이 아니라, 실제 시스템에서 데이터 무결성과 안정성의 최후 보루다.

속성이 하나라도 무너지면 “커밋됐지만 저장되지 않음”, “이체했는데 금액이 사라짐”, “동시 접속 시 데이터 꼬임” 같은 치명적 문제가 발생할 수 있다.

결국 이는 비즈니스 신뢰성사용자 경험에 직결된다.

⚙️EndNote

사전 지식

  • 트랜잭션 정의와 트랜잭션 경계 설정
  • 데이터베이스의 커밋/롤백 메커니즘
  • SQL 격리 수준과 락(lock) 종류 (공유 락, 배타 락 등)

더 알아보기