동시 실행되는 여러 트랜잭션 간 데이터 충돌을 얼마나 방지할 것인지 결정하는 기준
격리 수준이 높을수록 정합성은 높아지지만, 동시성 처리 능력과 성능은 떨어질 수 있다
특징 및 사용 상황
| 격리 수준 | 특징 | 상황 |
| Read Uncommitted | Dirty Read 허용, 빠름 | 데이터 정합성이 크게 중요하지 않은 읽기 전용 로그, 통계용 쿼리 등 |
| Read Committed | Dirty Read 방지 | 일반적인 비즈니스 트랜잭션에서 사용 적합 |
| Repeatable Read | Non-Repeatable Read 방지 | 정확한 값 유지가 중요한 계산 |
| Serializable | 모든 현상 방지, 느림 | 가장 높은 데이터 정합성이 필요한 경우, 또는 경쟁 조건(race condition)을 엄격히 막아야 할 때 |
장점 및 Spring @Transactional options
| 격리 수준 | 장점 | Java (Spring) |
| Read Uncommitted | 매우 빠름, Lock 거의 없음 | Isolation.READ_UNCOMMITTED |
| Read Committed | Dirty Read 방지, 적당한 성능 | Isolation.READ_COMMITTED |
| Repeatable Read | Dirty Read, Non-Repeatable Read 방지 | Isolation.REPEATABLE_READ |
| Serializable | 모든 문제 방지 | Isolation.SERIALIZABLE |
DBMS
| 격리 수준 | MySQL | PostgreSQL |
| Read Uncommitted | SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED; | 동일 |
| Read Committed | SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; | 기본값 |
| Repeatable Read | 기본값 | SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ; |
| Serializable | SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; | SET SESSION TRANSACTION ISOLATION LEVEL SERIALIZABLE; |
오류 현상 및 방지되는 격리
| 현상 | 설명 | 방지되는 격리 |
| Dirty Read (더러운 읽기) |
다른 트랜잭션이 아직 커밋하지 않은 데이터를 읽는 현상. → 나중에 롤백되면 잘못된 데이터를 읽은 게 됨. | Read Committed 이상 |
| Non-Repeatable Read (반복 불가능한 읽기) |
같은 트랜잭션 내에서 같은 쿼리를 두 번 실행했는데 결과가 다른 경우. 다른 트랜잭션이 중간에 값을 수정하거나 삭제해서 발생. | Repeatable Read 이상 |
| Phantom Read (팬텀 읽기) |
같은 조건의 SELECT를 반복 실행했을 때 처음엔 없던 행이 나중에 생겨나는 현상. 다른 트랜잭션이 데이터를 삽입했기 때문. | Serializable만 방지 가능 |
'CS 정리' 카테고리의 다른 글
| Spring Security + Keycloak으로 SSO 구현하기 (0) | 2025.07.13 |
|---|---|
| 네트워크 프록시 (0) | 2025.07.08 |
| 트리 인덱스, B- B+ (2) | 2025.07.05 |
| R2DBC란? WebFlux 활용 (0) | 2025.07.01 |
| Spring WebFlux: 왜, 언제, 어떻게? (0) | 2025.06.29 |