본문 바로가기
Database2026년 7월 16일3분 읽기

트랜잭션 ACID란 — 데이터가 깨지지 않게 지키는 4가지

YS
김영삼
조회 353
트랜잭션 ACID란 — 데이터가 깨지지 않게 지키는 4가지

핵심 요약

트랜잭션은 여러 작업을 "전부 성공 아니면 전부 취소"로 묶는 단위다. A 계좌에서 빼고 B 계좌에 넣는 이체 도중 서버가 죽어도 돈이 증발하지 않는 건 트랜잭션 덕분이다. 그 보장을 4가지로 정리한 게 ACID다.

1. ACID 4가지

속성의미
Atomicity(원자성)전부 성공 or 전부 취소. 중간 상태 없음
Consistency(일관성)규칙(제약·불변식)을 항상 만족하는 상태로 전이
Isolation(격리성)동시 트랜잭션이 서로 간섭하지 않음
Durability(지속성)커밋되면 장애가 나도 유지됨

2. 원자성 — 이체 예시

BEGIN;
  UPDATE accounts SET balance = balance - 10000 WHERE id = 1;
  UPDATE accounts SET balance = balance + 10000 WHERE id = 2;
COMMIT;   -- 둘 다 반영, 또는
ROLLBACK; -- 하나라도 실패 시 둘 다 취소

두 번째 UPDATE 전에 서버가 죽으면? 커밋 안 된 첫 UPDATE는 롤백되어 빠져나간 돈이 되돌아온다. "중간에 멈춘 상태"가 남지 않는 게 원자성이다.

3. 격리성 — 동시성이 어려운 이유

여러 트랜잭션이 같은 데이터를 동시에 건드리면 더티 리드·팬텀·갱신 유실 같은 문제가 생긴다. DB는 격리 수준(READ COMMITTED, REPEATABLE READ 등)으로 "얼마나 엄격히 격리할지"를 조절한다. 엄격할수록 안전하지만 동시성(성능)은 떨어지는 트레이드오프가 있다.

4. 실무에서

  • 돈·재고처럼 정합성이 중요한 작업은 반드시 트랜잭션으로 묶어라.
  • 트랜잭션은 짧게 — 길게 열어두면 락이 오래 걸려 다른 요청을 막고 데드락 위험이 커진다.
  • 트랜잭션 안에서 외부 API 호출·긴 작업을 하지 마라(락을 잡은 채 대기하게 된다).

자주 묻는 질문

모든 쿼리를 트랜잭션으로 감싸야 하나요?

단일 쿼리는 대개 그 자체로 원자적이라 명시적 트랜잭션이 불필요합니다. 트랜잭션은 "여러 변경이 반드시 함께 성공/실패해야 하는" 경우(이체, 주문+재고 차감 등)에 씁니다.

NoSQL은 ACID가 없나요?

과거엔 약했지만 요즘은 많은 NoSQL이 문서 단위 또는 다중 문서 트랜잭션을 지원합니다. 다만 분산 환경에선 강한 일관성과 가용성 사이에 트레이드오프가 있어, 제품별로 보장 범위를 확인하고 써야 합니다.

격리 수준은 뭘 골라야 하나요?

대부분의 DB 기본값(READ COMMITTED 또는 REPEATABLE READ)으로 시작하면 됩니다. 더 엄격한 격리가 필요한 특정 로직만 개별적으로 올리세요. 무작정 최고 수준(SERIALIZABLE)으로 두면 동시성이 크게 떨어집니다.

댓글 0

아직 댓글이 없습니다.
Ctrl+Enter로 등록