Contents
see List작성일 2025. 11. 30.
트랜잭션 격리 수준 완벽 가이드
데이터베이스 트랜잭션 격리 수준(Isolation Level)은 동시에 실행되는 트랜잭션 간의 데이터 일관성을 제어합니다. 각 수준의 특징과 발생 가능한 문제를 알아봅니다.
1. 격리 수준 종류
| 격리 수준 | Dirty Read | Non-Repeatable | Phantom |
|---|---|---|---|
| READ UNCOMMITTED | O | O | O |
| READ COMMITTED | X | O | O |
| REPEATABLE READ | X | X | O |
| SERIALIZABLE | X | X | X |
2. 문제 유형 설명
Dirty Read (더티 리드)
- 커밋되지 않은 데이터를 읽음
- 롤백되면 잘못된 데이터 사용
Non-Repeatable Read (반복 불가능 읽기)
- 같은 쿼리가 다른 결과 반환
- 다른 트랜잭션이 UPDATE 후 커밋
Phantom Read (팬텀 리드)
- 같은 조건으로 조회 시 행 수가 달라짐
- 다른 트랜잭션이 INSERT/DELETE 후 커밋3. READ UNCOMMITTED
-- 가장 낮은 격리 수준
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
-- 커밋 안된 데이터도 읽음
-- 성능 최고, 일관성 최저
-- 사용 사례: 대략적인 통계, 로그 조회4. READ COMMITTED (대부분 DB 기본값)
-- Oracle, SQL Server 기본값
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
-- 커밋된 데이터만 읽음
-- 같은 쿼리도 결과가 달라질 수 있음
-- 사용 사례: 일반적인 OLTP 환경5. REPEATABLE READ
-- MySQL InnoDB 기본값
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 트랜잭션 시작 시점 스냅샷 사용
-- 같은 쿼리는 같은 결과 보장
-- 사용 사례: 보고서, 정산 처리6. SERIALIZABLE
-- 가장 높은 격리 수준
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
-- 완벽한 격리, 순차 실행처럼 동작
-- 성능 저하, 데드락 가능성 높음
-- 사용 사례: 금융 거래, 재고 관리7. 실전 예시: MySQL
-- 현재 격리 수준 확인
SELECT @@transaction_isolation;
-- 세션 격리 수준 변경
SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
-- 글로벌 변경
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;8. 실전 예시: Oracle
-- Oracle은 READ COMMITTED와 SERIALIZABLE만 지원
ALTER SESSION SET ISOLATION_LEVEL = SERIALIZABLE;
-- 트랜잭션별 설정
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;9. Spring에서 설정
@Transactional(isolation = Isolation.READ_COMMITTED)
public void processOrder() {
// ...
}
@Transactional(isolation = Isolation.REPEATABLE_READ)
public void generateReport() {
// ...
}선택 가이드
- 일반 웹 서비스: READ COMMITTED
- 보고서/정산: REPEATABLE READ
- 재고/결제: SERIALIZABLE (또는 비관적 락)
- 로그 조회: READ UNCOMMITTED
database
| No | 작성일 | Title |
|---|---|---|
| 3380 | 2026. 08. 20. | PostgreSQL 느린 조회를 진단하는 방법: EXPLAIN ANALYZE와 복합 인덱스 실전 가이드 |
| 3348 | 2026. 08. 11. | PostgreSQL 잠금 대기 줄이기: 트랜잭션 범위와 lock_timeout 설정 실전 가이드 |
| 3316 | 2026. 08. 03. | PostgreSQL 백업 복구 실전 가이드: pg_dump·pg_restore로 장애 복구 절차 만들기 |
| 3284 | 2026. 07. 26. | PostgreSQL 인덱스가 있는데도 느린 쿼리 해결하기: EXPLAIN ANALYZE와 복합 인덱스 설계 |
| 3254 | 2026. 07. 18. | PostgreSQL 잠금 대기 진단 가이드: pg_stat_activity로 블로킹 쿼리 찾고 장애 줄이기 |
| 3202 | 2026. 07. 09. | PostgreSQL 백업 복구 검증 가이드: pg_dump와 psql로 실제 복원까지 확인하기 |
| 3170 | 2026. 07. 01. | MySQL 느린 쿼리 원인 찾기: EXPLAIN과 복합 인덱스 점검 가이드 |
| 3116 | 2026. 06. 23. | PostgreSQL 트랜잭션 충돌 줄이기: 잠금 순서와 짧은 재시도로 데드락 대응하기 |
| 3058 | 2026. 06. 15. | PostgreSQL JSONB 조회 튜닝: GIN 인덱스와 생성 컬럼으로 느린 검색 줄이기 |
| 2971 | 2026. 06. 07. | MySQL/MariaDB 복합 인덱스 설계: 느린 목록 조회를 줄이는 WHERE·ORDER BY 점검법 |