✅들어가면서
데이터베이스를 공부하다 보면 반드시 등장하는 개념이 있다.
“트랜잭션이 뭐야?”
“ACID는 왜 그렇게 중요해?”
이 글에서는 단순 정의가 아니라
왜 필요한지 + 실제 상황에서 어떻게 문제를 막는지까지 이해해보겠다.
⭐ 트랜잭션(Transaction)이란?
트랜잭션은 쉽게 말해서 “하나의 작업 단위” 이다.
여러 개의 SQL을 하나로 묶어서 전부 성공하거나 전부 실패하도록 만드는 것이다.
💡예시: 음식 주문 시스템
사용자가 음식을 주문한다고 가정해보자.
- 주문 생성
- 결제 처리
- 재고 차감
이 3개는 따로 실행되면 안 된다.
❌ But, 문제 발생
- 결제는 됐는데 재고 차감 실패
- 주문은 생성됐는데 결제 실패
이런 경우 데이터가 꼬이게 된다.
이때 사용하는 것이 바로 트랜잭션
✅ 트랜잭션 적용
세 작업을 하나로 묶음
- 모두 성공 → commit
- 하나라도 실패 → rollback
항상 정상 상태 유지
⭐ ACID 원칙이란?
트랜잭션이 안전하게 동작하기 위한 4가지 규칙이다.
- 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)의 앞글자를 딴 규칙
1️⃣ Atomicity (원자성)
“전부 아니면 전부 아니다”
- 일부만 성공하는 상태는 존재하지 않음
💡예시: 포인트 충전
- 사용자 포인트 +10,000
- 결제 내역 저장
👉 만약 2번이 실패하면?
👉 1번도 취소되어야 함
결과적으로 둘 다 성공하거나, 둘 다 실패하거나
2️⃣ Consistency (일관성)
"트랜잭션 전후 데이터는 항상 유효해야 함"
💡예시: 좌석 예약 시스템
- 영화관 좌석은 1개인데
- 동시에 2명이 예약
❌ 이런 상황은 발생하면 안 됨
정리하자면 DB 규칙(제약조건)을 지켜야 함
3️⃣ Isolation (격리성)
"여러 트랜잭션이 동시에 실행될 때 서로 영향을 주면 안 됨"
💡예시: 쇼핑몰 재고 감
초기 재고: 10개
- 사용자 A → 5개 구매
- 사용자 B → 6개 구매
동시에 실행되면?
둘 다 재고 10으로 읽고 계산
결과: 재고 -1 (문제 발생)
이러한 문제를 막기 위해 격리 수준(Isolation Level) 존재한다.
격리 수준 (Isolation Level): 트랜잭션 간 간섭을 얼마나 허용할지 결정하는 단계이다.
1. Read Uncommitted: 커밋되지 않은 데이터도 읽을 수 있음(가장 낮은 수준의 격리 수준)
- Dirty Read: 커밋되지 않은 데이터를 읽을 수 있어, 나중에 해당 데이터가 롤백되면 일관성이 깨진다.
- Non-Repeatable Read(비반복 가능 읽기): 같은 쿼리를 두 번 실행했을 때 결과가 다를 수 있다.
- Phantom Read(팬텀 리드): 트랜잭션 중간에 다른 트랜잭션에 의해 새로운 행이 삽입되면, 쿼리 결과에 추가될 수 있다.
2. Read Committed: 커밋된 데이터만 읽음
- Non-Repeatable Read(비반복 가능 읽기)
- Phantom Read(팬텀 리드)
3. Repeatable Read: 같은 데이터를 여러 번 읽어도 동일한 결과 보장
- Phantom Read(팬텀 리드)
4. Serializable: 트랜잭션을 순차적으로 실행한 것처럼 처리 (가장 강력한 격리 수준)
- 발생 가능한문제가 없음. 모든 이상 현상을 방지한다.
* 트랜잭션 격리 수준 2단계와 3단계의 차이 = 한 트랜잭션 내에서 동일한 데이터를 여러 번 조회했을 때 그 결과가 일관되게 유지되는지 여부(Non-Repeatable Read 발생 여부)이다
4️⃣ Durability (지속성)
"한 번 commit된 데이터는 절대 사라지지 않음"
💡예시: 결제 완료
- 결제 완료 후 서버 다운
재시작해도 결제 데이터 유지되어야 함
어떻게 보장할까?
WAL (Write-Ahead Logging)로 보장한다.
- 먼저 로그 기록
- 이후 실제 데이터 반영
👉 장애 발생 시 복구 가능
🔄 트랜잭션 동작 과정
- BEGIN
- 작업 수행
- 성공 → COMMIT
- 실패 → ROLLBACK
💡예시:
- 상품을 장바구니에 추가
- 상품 조회
- 사용자 조회
- 장바구니 테이블에 추가
👉 중간에 실패하면? -> 전체 롤백
- 데이터 수정
- 기존 데이터 조회
- 값 변경
- 저장
👉 문제 발생 시 rollback
🔥 핵심 정리
정리하자면,
트랜잭션 = 작업을 안전하게 묶는 단위
ACID = 그 작업이 안전하게 수행되도록 보장하는 규칙
'DB' 카테고리의 다른 글
| 정규화 vs 반정규화 (0) | 2026.03.20 |
|---|---|
| DB 인덱스(Index)란? (0) | 2026.03.20 |
| RDB vs NoSQL, 언제 무엇을 써야 할까? (0) | 2026.03.20 |