트랜잭션(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이 지켜지지 않는 경우
- 사용자 A가 상품 상세 페이지를 본다: 재고: 1
- 사용자 B도 같은 시점에 재고: 1 확인
- 동시에 결제 요청
- 둘 다 재고가 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 |