Database

[DB] 트랜잭션 (Transaction)의 4가지 속성 - ACID 란

Code & Beyond 2025. 6. 30. 09:59

 

트랜잭션(Transaction)

  • 트랜잭션은 데이터베이스에서 하나의 작업 단위를 의미하며, 정합성을 보장하기 위해 다음 4가지 속성을 만족해야 한다.

Actomicity (원자성)

더보기

트랜잭션은 모두 실행에 성공하거나, 모두 실행에 실패해야 한다.

  • 중간에 에러가 발생하면 모든 작업을 롤백(Rollback) 하여 아무 일도 없던 것처럼 데이터를 복원 시켜야 한다.
  • 마치 "All or Nothing" 원칙과도 같다.

 

예시

-- 계좌 이체 트랜잭션
1. A 계좌에서 -1000원 출금
2. B 계좌에 +1000원 입금

 

중간에 B 계좌 입금이 실패한다면 A의 출금도 취소되어야 한다.

 

Consistency (일관성)

더보기

트랜잭션은 전후에 데이터의 제약 조건이나 규칙이 항상 만족되어야 한다. 

  • 트랜잭션이 완료되면 데이터는 항상 유효한 상태로 유지되어야 한다.
  • 무결성 (Integrity, 무결점의 성질) 제약 조건, 외래키, 유니크 등을 포함

 

예시

재고 수량은 0보다 크다는 제약조건이 존재할 때, 트랜잭션 수행 결과 이 조건이 항상 만족되어야 함

 

 

Isolation (고립성)

더보기

동시에 실행되는 트랜잭션이 서로에게 영향을 미치지 않아야 한다.

  • 여러 사용자가 동시에 작업하더라도 각각의 트랜잭션이 독립적으로 보장되어야 한다.
  • 격리 수준(Isolation Level) 설정으로 조절 가능 (READ COMMITTED, SERIALIZABLE 등)

 

예시

 

사용자가 동시에 같은 상품을 구매할 때, 재고 차감이 충돌 없이 일어나야 한다.

 

한정 수량 상품 동시 구매 상황

  • 인기 한정판 상품이 딱 1개 남음
  • 동시에 2명의 사용자가 구매 버튼을 누름
  • 두 사람 모두 주문이 성공하면 재고는 -1이 되어버림 ❌ (이건 비즈니스적으로, 시스템적으로도 치명적)


만약 Isolation이 지켜지지 않는 경우

  1. 사용자 A가 상품 상세 페이지를 본다: 재고: 1
  2. 사용자 B도 같은 시점에 재고: 1 확인
  3. 동시에 결제 요청
  4. 둘 다 재고가 1이라고 믿고 주문을 완료

👉 최종 결과: 주문 2건, 재고 -1 → 데이터 정합성 깨짐

 

 

Isolation이 지켜지는 경우

  • DB는 트랜잭션 A와 B를 순차적으로 처리 (격리 수준에 따라 다르지만, 기본적으로 동시성 제어가 이뤄짐)
    • 사용자 A가 트랜잭션 시작 → 재고 확인 → 1 → 주문 → 재고 -1 → 커밋
    • 사용자 B가 트랜잭션 시작 → 재고 확인 → 0 (변경 반영됨) → 주문 실패 or 대기 처리

👉  이렇게 되면 재고는 -1이 되는 일 없이 정확히 하나만 팔림

 

Durability (지속성)

더보기

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

  • 시스템이 다운되더라도 커밋된 트랜잭션의 결과는 사라지지 않는다.
  • 대부분의 DB는 디스크에 기록하여 보장 (Write-Ahead Logging 등)

 

예시

주문 결제가 완료되고 “성공” 메시지가 떴다면, 서버가 바로 꺼져도 해당 주문은 DB에 남아있어야 함.

 

 

마무리 요약

속성 설명 키워드
Atomicity 전부 실행 or 전부 취소 All or Nothing
Consistency 항상 유효한 상태 유지 무결성, 제약조건 유지
Isolation 트랜잭션 간 간섭 방지 격리 수준, 동시성
Durability 결과는 영구 저장 장애 복구 가능

'Database' 카테고리의 다른 글

[DB] CAP 이론  (0) 2025.03.16
[DB] 분산 저장 기법 - 2. 샤딩 (Sharding)  (0) 2025.03.09
[DB] 분산 저장 기법 - 1. 파티셔닝(Partitioning)  (0) 2025.03.02