CS 정리

트랜잭션 격리 수준

문쿼리 2025. 7. 7. 21:32

동시 실행되는 여러 트랜잭션 간 데이터 충돌을 얼마나 방지할 것인지 결정하는 기준

격리 수준이 높을수록 정합성은 높아지지만, 동시성 처리 능력과 성능은 떨어질 수 있다

 

특징 및 사용 상황

격리 수준 특징 상황
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