Read 시 데이터 조회에 문제가 발생 할 수 있는 상황들
1. Dirty Read
다른 트랜잭션에서 아직 커밋되지 않은(uncommitted) 데이터를 읽는 것
- A 트랜잭션이 커밋되기 전에, B 트랜잭션이 이를 읽어서 트랜잭션을 처리하고 / A는 예외 발생으로 롤백된 경우?
- 문제되는 데이터때문에 B트랜잭션의 작동 또한 문제가 될 수 있다.
- A트랜잭션이 커밋 되기 전 데이터를 읽게 되서 발생하는 문제
2. Non-Repeatable Read
트랜잭션에서 같은 쿼리를 두 번 이상 실행할 때, 결과가 다르게 나타나는 현상
- 다른 트랜잭션이 데이터를 변경하여, 첫 번째 쿼리 실행 결과와 다른 결과를 가져올 수 있는 현상
- 한 트랜잭션 A 안에서 read(a1) 가 발생하고, read(a2)가 발생한다고 가정하자.
- 이 a1 과 a2 사이에 다른 트랜잭션인 B가 개입하여 read하는 데이터를 수정/삭제 하게 된다면 A가 읽은 데이터 값이 이전과 다르게 나타날 수 있다.
3. Phantom Read:
한 트랜잭션에서 같은 쿼리를 두 번 이상 실행할 때, 결과 집합(Collection)이 다른 현상
-
다른 트랜잭션이 데이터를 추가 또는 삭제하여, 첫 번째 쿼리 실행 결과와 다른 결과를 가져올 수 있기 때문
-
예를 들어 트랜잭션 A가 특정 범위의 데이터를 읽은 후
-
해당 범위에 속한 데이터를 추가하는 트랜잭션 B가 실행되고
-
다시 A가 같은 범위의 데이터를 읽을 때
-
A가 읽은 결과 집합이 이전과 다르게 나타난다.
위 문제들 때문에, 트랜잭션 관리가 필요 할 때 스프링에서는 아래와 같이 사용한다.
Transactional isolation level
0. ISOLATION_DEFAULT
데이터베이스에 의존한다.

위와 같이 uderlying data source 의 디폴트 레벨 사용한다.
1. READ_UNCOMMITTED (Level 1)
다른 트랜잭션이 커밋하지 않은(uncommitted) 데이터를 읽을 수 있다.
- 이 때문에 Dirty Read 문제가 발생할 가능성이 있다.
2. READ_COMMITTED (Level 2)
다른 트랜잭션에서 커밋된 데이터만 읽을 수 있다.
- Dirty Read는 발생하지 않지만, Non-Repeatable Read 문제가 발생할 수 있다.
3. REPEATABLE_READ (Level 3)
다른 트랜잭션이 새로운 데이터를 입력했다면 볼 수 있다.
트랜잭션이 완료 될때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리므로 다른 트랜잭션은 그 영역에 해당되는 데이터에대한 수정이 불가능하다
- Non-Repeatable Read는 발생하지 않지만, Phantom Read 문제가 발생할 수 있다.
SERIALIZABLE (Level 4)
하나의 트랜잭션이 완료된 후에 다른 트랜잭션이 실행하는 것처럼 지원한다.
동일한 데이터에 대해서 동시에 두 개 이상의 트랜잭션이 수행 될 수 없다.