..

RDBMS ACID 개요: 데이터베이스의 트랜잭션 보장 범위

TOC


  1. Overview
  2. ACID란 무엇인가
  3. 데이터베이스가 보장하는 범위
  4. 데이터베이스가 보장하지 않는 범위
  5. Conclusion

Overview


앞선 글에서는 트랜잭션의 필요성, Auto Commit, 트랜잭션 경계, Spring의 @Transactional 동작을 살펴봤다.

이번 글에서는 ACID의 의미와 데이터베이스 트랜잭션의 보장 범위를 간단히 정리한다.

ACID란 무엇인가


ACID는 트랜잭션이 가져야 할 네 가지 성질의 앞 글자를 따서 만든 이름이다.

속성 의미 대표 상황
Atomicity 변경을 모두 성공시키거나 모두 취소한다. 계좌 이체 중 입금이 실패한다.
Consistency 허용된 데이터 상태를 유지한다. 잔액이 음수가 된다.
Isolation 동시 실행되는 트랜잭션의 간섭을 조절한다. 두 요청이 같은 잔액을 변경한다.
Durability 커밋된 변경을 보존한다. 커밋 직후 애플리케이션이 종료된다.

ACID는 데이터베이스가 모든 업무 규칙을 알아서 처리한다는 뜻은 아니다.

데이터베이스가 보장하는 범위


트랜잭션 시작
  ├─ 데이터 변경
  └─ 데이터 변경
트랜잭션 종료
  └─ COMMIT 또는 ROLLBACK

트랜잭션에 포함된 변경은 하나의 단위로 처리된다. 어떤 작업을 트랜잭션에 포함할지는 애플리케이션이 결정한다.

데이터베이스가 보장하지 않는 범위


DB 커밋과 애플리케이션 기능의 완료는 같은 의미가 아니다.

DB 잔액 변경 및 COMMIT 성공
  ↓
메시지 발행 실패
  ↓
정산 시스템이 상환 사실을 전달받지 못함

다음 작업은 DB 트랜잭션만으로 보장되지 않는다.

  • 외부 API 호출의 롤백
  • 메시지 브로커로의 이벤트 발행
  • 중복 요청의 방지
  • 애플리케이션 업무 규칙의 검증
  • 여러 시스템 사이의 데이터 동기화

이 문제는 Outbox, 재처리, Unique Constraint, Idempotency Key 같은 별도 설계가 필요하다.

Conclusion


ACID는 데이터베이스 트랜잭션의 보장 범위를 설명한다. 애플리케이션의 업무 전체나 외부 시스템까지 자동으로 보호하지는 않는다.

ACID는 데이터베이스 트랜잭션의 신뢰성을 보장하지만, 애플리케이션의 업무 전체를 자동으로 안전하게 만들어주지는 않는다.