Transaction Isolation level ( with Dirty read, Non-Repeatable read, Phantom read)

Kim Dong Kyun·2023년 4월 30일
1

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)

하나의 트랜잭션이 완료된 후에 다른 트랜잭션이 실행하는 것처럼 지원한다.

동일한 데이터에 대해서 동시에 두 개 이상의 트랜잭션이 수행 될 수 없다.

  • 성능이 저하된다. (거의 쓰지 않는다)

0개의 댓글