📦 트랜잭션(Transaction)
DBMS에서 데이터를 다루는 논리적인 작업 단위
- 트랜잭션 내 모든 SQL문은 전체 수행되거나, 전체 취소(Rollback) 됨 → 부분 적용❌
- 데이터 장애 발생 시 복구할 수 있는 최소 단위
🧬 ACID 특성
트랜잭션이 가져야 할 4가지 핵심 속성
🧱 1. Atomicity (원자성)
- 트랜잭션은 쪼갤 수 없는 작업 단위로 작동
- 전체 성공 또는 전체 실패 (All or Nothing)
- 🔧 관련 명령어:
START TRANSACTION, COMMIT, ROLLBACK, SAVEPOINT
🔄 2. Consistency (일관성)
- 트랜잭션 수행 전후의 데이터는 항상 일관된 상태 유지
- 무결성 제약조건(Primary Key, Foreign Key 등)을 위반하지 않음
🛡️ 3. Isolation (격리성)
- 동시에 실행되는 트랜잭션끼리 간섭 X
- 임시 데이터 접근 방지 필요 → Lock 등으로 제어
💾 4. Durability (지속성)
- 트랜잭션 성공(COMMIT) 후에는 영구히 반영
- 장애 발생해도 변경 내용은 데이터베이스에 보존
🔐 Lock (잠금)
트랜잭션 격리성을 보장하기 위한 핵심 기법
- 데이터 무결성을 유지하기 위해 동시 접근 제한
- 트랜잭션이 데이터를 사용하는 동안, 다른 트랜잭션이 접근하지 못하게 차단
🔄 락 종류
- 🔗 공유 락 (Shared Lock): 읽기 전용, 여러 트랜잭션이 동시에 읽을 수 있음
- 🔒 배타 락 (Exclusive Lock): 읽기 + 쓰기 가능, 다른 트랜잭션은 접근 불가
⚠️ 교착상태(Deadlock) 발생 조건
- 상호 배제: 하나의 자원은 한 번에 하나의 트랜잭션만 사용 가능
- 점유와 대기: 자원을 점유한 상태에서 다른 자원을 기다림
- 비선점: 자원을 강제로 빼앗을 수 없음
- 순환 대기: 트랜잭션 간에 자원을 서로 기다림
🧩 트랜잭션 격리 수준 (Isolation Level)
동시성 처리 중 성능 ↔ 안정성의 균형을 위한 설정
⚠️ 읽기 현상(Read Phenomena)
| 현상 | 설명 |
|---|
| 🔸 Dirty Read | Commit되지 않은 데이터를 읽음 |
| 🔸 Non-Repeatable Read | 같은 SELECT 결과가 반복할 때 달라짐 |
| 🔸 Phantom Read | WHERE 조건에 맞는 행의 추가/삭제가 발생 |
🧪 격리 수준 비교 (MySQL 기준)
| 수준 | 설명 | 방지 현상 |
|---|
| 1. Read Uncommitted 😬 | 가장 낮은 수준, 커밋 전 데이터 읽음 | 없음 |
| 2. Read Committed 🔍 | 커밋된 데이터만 읽음 | Dirty Read |
| 3. Repeatable Read 🔁 | 같은 트랜잭션 내 SELECT 결과 유지 | Dirty, Non-Repeatable Read |
| 4. Serializable 🚧 | 완전 직렬화, 가장 안전하지만 느림 | 모든 읽기 현상 방지 |
⚙️ 격리 수준 설정 방법 (MySQL)
-
세션 단위 변경
SET SESSION TRANSACTION ISOLATION LEVEL 수준;
-
전체(Global) 변경
SET GLOBAL TRANSACTION ISOLATION LEVEL 수준;
-
트랜잭션 시작 시 설정
START TRANSACTION ISOLATION LEVEL 수준;
👥 동시성 제어 (Concurrency Control)
여러 트랜잭션이 동시에 실행될 때, 데이터 무결성과 일관성을 지키기 위한 기능
❌ Lost Update (갱신 손실)
- 두 트랜잭션이 동시에 같은 데이터를 수정하면서 한 쪽 수정이 덮어씌워지는 현상
- 반드시 방지해야 함
🔐 Lock 관련 용어 요약
- 락(Lock): 트랜잭션이 데이터에 접근할 때 사용되는 제어장치
- 공유락 (Shared): 읽기 전용 시 설정
- 배타락 (Exclusive): 읽기 + 쓰기 시 설정
♻️ 회복 (Recovery)
트랜잭션 실패 시, 데이터의 일관성을 복원하는 기능
- 로그(Log), 체크포인트 등을 사용하여 복구 시점 이전 상태로 되돌리기
- 트랜잭션이 실패하면 → ROLLBACK, 성공하면 → COMMIT