
SOFTMOA TECHNOLOGY
트랜잭션 격리 수준 이해하기
소프트모아가 정리한 기술 기록입니다.
Contents
작성일 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
Share this
Database
Showing 1 to 10 of 86 entries
