DB

트랜잭션(Transaction)과 ACID 원칙

yj992233 2026. 3. 20. 02:11

✅들어가면서

데이터베이스를 공부하다 보면 반드시 등장하는 개념이 있다.

“트랜잭션이 뭐야?”
“ACID는 왜 그렇게 중요해?”

이 글에서는 단순 정의가 아니라
왜 필요한지 + 실제 상황에서 어떻게 문제를 막는지까지 이해해보겠다.


⭐ 트랜잭션(Transaction)이란?

트랜잭션은 쉽게 말해서 “하나의 작업 단위” 이다.

여러 개의 SQL을 하나로 묶어서 전부 성공하거나 전부 실패하도록 만드는 것이다.

💡예시: 음식 주문 시스템

사용자가 음식을 주문한다고 가정해보자.

  1. 주문 생성
  2. 결제 처리
  3. 재고 차감

이 3개는 따로 실행되면 안 된다.

 

❌ But, 문제 발생

  • 결제는 됐는데 재고 차감 실패
  • 주문은 생성됐는데 결제 실패

이런 경우 데이터가 꼬이게 된다.

이때 사용하는 것이 바로 트랜잭션

 

✅ 트랜잭션 적용

세 작업을 하나로 묶음

  • 모두 성공 → commit
  • 하나라도 실패 → rollback

항상 정상 상태 유지


⭐ ACID 원칙이란?

트랜잭션이 안전하게 동작하기 위한 4가지 규칙이다.

  • 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)의 앞글자를 딴 규칙

1️⃣ Atomicity (원자성)

“전부 아니면 전부 아니다”

  • 일부만 성공하는 상태는 존재하지 않음

💡예시: 포인트 충전

  1. 사용자 포인트 +10,000
  2. 결제 내역 저장

👉 만약 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)로 보장한다.

  • 먼저 로그 기록
  • 이후 실제 데이터 반영

👉 장애 발생 시 복구 가능


🔄 트랜잭션 동작 과정

  1. BEGIN
  2. 작업 수행
  3. 성공 → COMMIT
  4. 실패 → ROLLBACK

💡예시: 

  • 상품을 장바구니에 추가
  1. 상품 조회
  2. 사용자 조회
  3. 장바구니 테이블에 추가

👉 중간에 실패하면? -> 전체 롤백

  • 데이터 수정
  1. 기존 데이터 조회
  2. 값 변경
  3. 저장

👉 문제 발생 시 rollback


🔥 핵심 정리

정리하자면,
트랜잭션 = 작업을 안전하게 묶는 단위
ACID = 그 작업이 안전하게 수행되도록 보장하는 규칙

 

'DB' 카테고리의 다른 글

정규화 vs 반정규화  (0) 2026.03.20
DB 인덱스(Index)란?  (0) 2026.03.20
RDB vs NoSQL, 언제 무엇을 써야 할까?  (0) 2026.03.20