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 |
트랜잭션을 직렬처럼 처리 (락 또는 검증 기반) |
모든 문제 방지 | 성능 저하, 동시성 낮음 |