JPA Propagation과 Isolation

김신영·2023년 5월 21일
0

JPA

목록 보기
14/14
post-thumbnail

Propagation

트랜잭션의 영역, 바운더리를 지정하기 위한 설정이다.

종류트랜잭션존재트랜잭션미존재비고
REQUIRED기존 트랜잭션 이용신규 트랜잭션 생성기본설정이다
SUPPORTS기존 트랜잭션 이용트랜잭션 없이 수행
MANDATORY기존 트랜잭션 이용Exception 발생꼭 이전트랜잭션이 있어야 하는경우
NEVERexception이 발생한다정상적으로 트랜잭션 없이 수행트랜잭션 없을때만 작업이 진행되어야할때
NOT_SUPPORTED트랜잭션이 종료될 때 까지 대기한 후 트랜잭션이 종료되고 나면 실행트랜잭션 없이 로직이 수행기존 트랜잭션에 영향을 주지 않아야할때 사용된다.
REQUIRES_NEW현재 트랜잭션이 종료될 때 까지 대기한 후 새로운 트랜잭션을 생성하고 실행신규 트랜잭션을 생성하고 로직을 실행 이전트래잭션과 구분하여 새로운 트랜잭션으로만 처리가 필요할때 사용
NESTED현재 트랜잭션에 Save Point를 걸고 이후 트랜잭션을 수행REQUIRED와 동일하게 신규 트랜잭션을 생성하고 로직이 수행DBMS특성에 따라 지원 혹은 미지원

Isolation

동시 트랜잭션이 수행될때 다른 트랜잭션이 동일한 데이터에 대해서 어떻게 보일지에 대한 범위를 나타낸다.

  • READ_UNCOMMITTED
  • READ_COMMITTED
  • REPEATABLE_READ
  • SERIALIZABLE

READ_UNCOMMITTED

  • 가장 느슨한 isolation level이다.
  • 동시에 동일 데이터에 대해서 트랜잭션이 수행되는 경우 결과를 보장하지 못하고, 계속해서 커밋되지 않은 값을 읽을 수 있게 된다.
  • Dirty Read, Non-Repeatable Read, Phantom Read 현상이 모두 발생한다.

READ_COMMITTED

  • Dirty Read가 발생하지 않는다.
  • 하나의 트랜잭션에서 커밋이 수행된 데이터는 다시 읽기를 하면 변경된 데이터를 읽게 된다.
    • Non-Repeatable Read 현상과 Phantom Read 현상이 발생한다.

REPEATABLE_READ

  • Dirty Read, Non-Repeatable Read 현상이 발생하지 않는다.
    • 커밋되지 않는 데이터에 대해서 어떠한 사이드 이펙트가 없다.
    • 데이터를 다시 읽어도 원래 데이터를 그대로 유지하게 된다.
  • 그러나 범위 검색을 수행하는 경우 새로 추가된 데이터나, 삭제된 데이터가 보이게 된다.
    • Phantom Read 현상이 발생한다.

SERIALIZABLE

  • 이는 가장 엄격한 isolation level이다.
  • 동시성에 관련된 사이드 이펙트는 없다.
  • 그러나 성능이 매우 떨어지게 된다.
    • 왜냐하면 동시에 들어온 트랜잭션은 모두 serialize되어 순차적으로 수행되어야 하기 때문이다.

관련된 용어

Dirty Read

현재 트랜잭션에서 커밋되지 않은 변경 데이터를 다른 트랜잭션이 읽을 수 있음을 의미한다.

Non-Repeatable Read

가장 먼저 데이터를 읽은 데이터가, 다른 트랜잭션에서 변경을 했고, 이후 다시 데이터를 읽을때 변경된 데이트를 읽을 수 있음을 의미한다. (즉, 먼저 변경한 쪽의 데이터를 다시 읽게 됨을 의미)

Phantom read

다른 트랜잭션이 신규 데이터를 추가하거나, 기존 데이터를 삭제할때, 범위 쿼리를 수행하면 데이터 row가 달라지는 현상을 말한다.

profile
Hello velog!

0개의 댓글