| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
Tags
- TypeScript
- font-size
- ZOOM
- Websocket
- angular
- 0.25px border
- ES5
- 타입스크립트
- 1px border
- 클론코딩
- es6
- 서버리스 #
- 컴포넌튼
- 문서번호
- github
- entity
- 으
- TS
- literal
- &연산
- 10px
- 0.75px border
- 전역변수
- 데이터베이스 #try #이중
- Strict
- npm
- jwt
- 당근마켓
- Props
- 0.5px border
Archives
- Today
- Total
복잡한뇌구조마냥
[DB] 트랜잭션(Transaction)과 ACID 특성 정리 본문
데이터베이스에서 트랜잭션(Transaction) 은
“하나의 논리적인 작업 단위(Logical Unit of Work)”를 의미합니다.
즉, 여러 SQL 작업을 하나의 묶음으로 처리해서
모두 성공하면 Commit, 하나라도 실패하면 Rollback 하는 개념이에요.
💡 트랜잭션(Transaction) 이란?
하나 이상의 SQL 명령어를 하나의 논리적 단위로 묶어서,
전부 성공하거나 전부 실패하도록 보장하는 것.
예를 들어, 계좌이체를 생각해볼까요?
A 계좌에서 10,000원 출금 B 계좌에 10,000원 입금
이 두 작업은 둘 다 성공하거나, 둘 다 실패해야 합니다.
만약 출금만 되고 입금이 안 되면 큰일이죠 😅
👉 이처럼 데이터의 일관성과 무결성을 보장하기 위해 트랜잭션이 필요합니다.
🧩 트랜잭션의 4가지 ACID 특성
트랜잭션은 아래 ACID 4가지 원칙을 만족해야 합니다.
| 이름 | 설명 | 예시 |
| Atomicity (원자성) | 트랜잭션은 “모두 수행되거나 전혀 수행되지 않아야 함” | 계좌이체 시 출금만 되고 입금이 안 되면 ROLLBACK |
| Consistency (일관성) | 트랜잭션 전후 데이터의 무결성 제약조건이 유지되어야 함 | 외래키, 제약조건 위배 없이 항상 일관된 상태 |
| Isolation (격리성) | 여러 트랜잭션이 동시에 수행돼도 서로 간섭하지 않아야 함 | 동시에 A→B, C→D 이체가 되어도 결과가 섞이지 않음 |
| Durability (지속성) | 트랜잭션이 Commit된 후에는 시스템 장애에도 결과가 보존됨 | Commit된 데이터는 서버가 꺼져도 복구 가능 |
🧠 트랜잭션 동작 예시
-- 계좌이체 트랜잭션 예시
START TRANSACTION;
UPDATE account SET balance = balance - 10000 WHERE user_id = 'A';
UPDATE account SET balance = balance + 10000 WHERE user_id = 'B';
COMMIT;
만약 두 번째 UPDATE에서 오류가 발생하면?
ROLLBACK; -- 전체 트랜잭션 취소 (A의 돈도 원상복구)
이 덕분에 데이터의 무결성이 유지됩니다.
(트랜잭션 단위로 처리 → 안전하게 데이터 관리)
🔄 트랜잭션의 상태 (Transaction States)
트랜잭션은 실행되는 동안 여러 단계를 거칩니다.
DBMS는 이 단계를 통해 트랜잭션의 진행 상황을 추적하고 관리합니다.
🧱 트랜잭션 주요 상태
| 상태 | 설명 |
| Active (활동) | 트랜잭션이 실행 중인 상태 (SQL 명령어 수행 중) |
| Partially Committed (부분 커밋) | 모든 명령이 실행 완료되어 커밋 직전 상태 (아직 디스크 반영 전) |
| Committed (커밋됨) | 트랜잭션이 성공적으로 종료되어 DB에 영구 반영된 상태 |
| Failed (실패) | 트랜잭션 수행 중 오류 또는 시스템 문제로 정상 수행 불가 상태 |
| Aborted (철회) | 트랜잭션이 Rollback 되어 이전 상태로 복구된 상태 |
🔁 트랜잭션 상태 전이도 (Transaction State Diagram)
┌──────────────┐
│ Active │
└──────┬───────┘
│ (모든 연산 수행 완료)
▼
┌─────────────────────┐
│ Partially Committed │
└──────┬──────────────┘
│ Commit 성공
▼
┌────────────┐
│ Committed │
└────────────┘
(오류 발생 시)
Active ─────→ Failed ─────→ Aborted
(Rollback 후 복구)
💬 쉽게 정리하면
| 상황 | 상태 |
| 트랜잭션 실행 중 | Active |
| SQL 모두 수행 후 커밋 대기 | Partially Committed |
| 커밋 성공 | Committed |
| 오류 발생 | Failed → Aborted |
🧱 Isolation Level (격리 수준)
격리성(Isolation)을 세밀하게 조정하기 위해
DBMS는 4가지 격리 수준(Isolation Level) 을 제공합니다.
| 수준 | 설명 | 발생 가능한 문제 |
| READ UNCOMMITTED | 커밋되지 않은 데이터도 읽을 수 있음 | Dirty Read |
| READ COMMITTED | 커밋된 데이터만 읽음 (기본값 in Oracle) | Non-Repeatable Read |
| REPEATABLE READ | 한 트랜잭션 내 동일 쿼리 결과 동일 (기본값 in MySQL) | Phantom Read |
| SERIALIZABLE | 완전한 직렬화 (동시성 ↓, 안전성 ↑) | 거의 없음 |
💬 쉽게 말해
격리성이 높을수록 안전하지만 동시성 처리 성능이 낮아짐
→ 상황에 맞게 조정하는 게 중요!
✅ 정리
| 개념 | 설명 |
| 트랜잭션(Transaction) | 여러 SQL 명령어를 하나의 논리 단위로 묶어 처리 |
| COMMIT / ROLLBACK | 트랜잭션 확정 / 취소 |
| ACID 특성 | 원자성, 일관성, 격리성, 지속성 |
| Isolation Level | 동시성 제어 단계 (READ UNCOMMITTED → SERIALIZABLE) |
LIST
'BE > DB' 카테고리의 다른 글
| [DB] 데이터 무결성(Integrity)의 종류와 제약조건 정리 (0) | 2025.11.02 |
|---|---|
| [SQL] 명령어 분류 - DDL / DML / DCL / TCL (0) | 2025.09.22 |
| [DB] Supabase 기본 세팅 (1) | 2025.07.14 |
| [DB] ERD Cloud 사용법 (1) | 2025.07.11 |
| [MariaDB] SQL 명령어 연습 (0) | 2025.05.27 |