Spring

트랜잭션 격리 수준

개발자 김마늘 2025. 4. 20. 22:26

트랜잭션의 ACID 속성 중 격리성이 보장되지 않을 때 발생할 수 있는 문제점들과, 이를 해결하기 위한 트랜잭션 격리 수준을 정리한 글입니다.

 

격리성

여러 트랜잭션이 동시에 수행될 때, 서로의 작업에 간섭하지 않도록 보장하는 성질

 

격리성이 보장되지 않을 때 발생하는 문제점

  • 다른 트랜잭션이 아직 커밋하지 않은 데이터를 읽을 수 있다. : Dirty Read
  • 한 트랜잭션에서 같은 데이터를 두 번 읽었는데 값이 달라질 수 있다. : Non-repeatable Read
  • 처음엔 없던 데이터가 반복 조회 시 새로 나타날 수 있다. : Phantom Read

→ 잘못되고 일관적이지 않는 데이터가 발생한다는 문제점이 있습니다.

 

트랜잭션 격리 수준

RDBMS는 위 문제들을 해결하기 위해 격리 수준을 정의해두었습니다.

격리 수준이 높을수록 데이터 일관성은 높아지지만 동시성은 떨어지고 성능도 저하될 수 있습니다.

격리수준 설명 방지되는 문제 허용되는 문제
READ UNCOMMITTED 커밋되지 않은 데이터도 읽음 없음 Dirty Read
Non-repeatable Read
Phantom Read
READ COMMITTED
(기본값: Oracle, PostgreSQL)
커밋된 데이터만 읽음 Dirty Read Non-repeatable Read
Phantom Read
REPEATABLE READ
(기본값: MySQL InnoDB)
읽은 데이터는 트랜잭션 동안 고정 Dirty Read
Non-repeatable Read
Phantom Read
SERIALIZABLE
트랜잭션을 직렬처럼 처리
(락 또는 검증 기반)
모든 문제 방지 성능 저하, 동시성 낮음