다른 트랜잭션에서 아직 커밋되지 않은(uncommitted) 데이터를 읽는 것
트랜잭션에서 같은 쿼리를 두 번 이상 실행할 때, 결과가 다르게 나타나는 현상
한 트랜잭션에서 같은 쿼리를 두 번 이상 실행할 때, 결과 집합(Collection)이 다른 현상
다른 트랜잭션이 데이터를 추가 또는 삭제하여, 첫 번째 쿼리 실행 결과와 다른 결과를 가져올 수 있기 때문
예를 들어 트랜잭션 A가 특정 범위의 데이터를 읽은 후
해당 범위에 속한 데이터를 추가하는 트랜잭션 B가 실행되고
다시 A가 같은 범위의 데이터를 읽을 때
A가 읽은 결과 집합이 이전과 다르게 나타난다.
위 문제들 때문에, 트랜잭션 관리가 필요 할 때 스프링에서는 아래와 같이 사용한다.
데이터베이스에 의존한다.
위와 같이 uderlying data source 의 디폴트 레벨 사용한다.
다른 트랜잭션이 커밋하지 않은(uncommitted) 데이터를 읽을 수 있다.
다른 트랜잭션에서 커밋된 데이터만 읽을 수 있다.
다른 트랜잭션이 새로운 데이터를 입력했다면 볼 수 있다.
트랜잭션이 완료 될때까지 SELECT 문장이 사용하는 모든 데이터에 Shared Lock이 걸리므로 다른 트랜잭션은 그 영역에 해당되는 데이터에대한 수정이 불가능하다
하나의 트랜잭션이 완료된 후에 다른 트랜잭션이 실행하는 것처럼 지원한다.
동일한 데이터에 대해서 동시에 두 개 이상의 트랜잭션이 수행 될 수 없다.