ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • @Transactional 세부 설정
    개발/Spring 2024. 3. 24. 23:00

    트랜잭션의 세부 설정을 통해 상황별로 적절한 설정을 하여 성능을 최적화할 수 있다.

     

    Transactional 세부 설정 종류

    • Isolation (격리 수준 설정)
    • Propagation(전파 수준 설정)
    • readOnly 속성
    • 트랜잭션 롤백 예외 설정
    • time-out 설정

     

    1. Isolation(격리 수준)

    일관성이 깨지는 것을 어느 정도까지 허용하느냐에 대한 설정이다.

    기본 설정은 DEFAULT이다.

    @Transactional(isolation=Isolation.DEFAULT)
    @Transactional(isolation=Isolation.READ_COMMITTED)

     

    READ_UNCOMMITTED (level 0)

    트랜잭션 처리 중 또는 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽는 것을 허용한다.
    사실상 격리를 하지 않는 정도.

    • Dirty Read 발생

     

    READ_COMMITTED (level 1)

    트랜잭션 처리 중 다른 트랜잭션에서 접근할 수 없도록 막는다.

    • Dirty Read 방지
    • 트랜잭션이 종료되기 전까지 다른 트랜잭션에서는 해당 데이터에 접근할 수 없게 된다.

     

    REPEATABLE_READ (level 2)

    트랜잭션 처리 중 SELECT 문에서 사용하는 모든 데이터에 shared lock이 걸린다.

    • Non-Repeatable Read 방지
    • Phantom Read는 발생할 수 있다.

     

    SERIALIZABLE (level 3)

    가장 엄격한 격리 수준을 적용하여 완벽한 일관성을 제공한다. 

    • Phantom Read 방지
    • 성능이 가장 낮아진다.
    • 모든 격리 수준 관련 문제를 해결할 수 있다.
    • 성능 문제로 거의 사용하지 않는다.

     

    2. Propagation (전파 수준)

    @Transactional(propagation=Propagation.NESTED)

     

    REQUIRED (기본 값)

    항상 트랜잭션이 실행된다.
    기존 부모 트랜잭션이 있으면, 해당 트랜잭션을 사용하고,
    없으면 새로운 트랜잭션을 생성하여 사용한다.

     

    REQUIRES_NEW

    항상 새로운 트랜잭션에서 실행된다.
    기존 트랜잭션이 있으면 일시중단 시킨다.

     

    SUPPORTS

    기존 부모 트랜잭션이 있으면 해당 트랜잭션을 사용하여 실행하고, 없으면 트랜잭션을 사용하지 않는다.

     

    NESTED

    항상 트랜잭션이 실행된다.
    기존 트랜잭션이 있으면, 해당 트랜잭션에 Save point를 만들고 기존 트랜잭션 내에 중첩 트랜잭션을 만든다.
    만약 오류 발생 시 Save point rollback 한다.
    따라서 하위 트랜잭션은 상위 트랜잭션의 영향을 받지만, 
    더 중요한 상위 트랜잭션은 하위 트랜잭션에 영향을 덜 받게 된다.

     

    3. ReadOnly

    트랜잭션을 읽기 전용 속성으로 지정한다.

    @Transactional(readOnly=true)

    해당 트랜잭션에서는 조회만 가능하고, 수정은 불가하게 된다.
    기능을 제한하는 설정이기 때문에, readOnly=true로 설정될 경우 성능이 향상된다.

     

    4. 트랜잭션 롤백 예외 설정

    예외 발생 시 트랜잭션을 롤백시키거나, 롤백시키지 않기 위한 옵션을 설정한다.

    @Transactional(rollbackFor=MyException.class)

    -> Exception 발생 시 롤백한다.

     

    @Transactional(noRollbackFor=MyException.class)

    -> MyException 발생 시에는 롤백하지 않는다.

     

    default는 RuntimeException, Error이다.

     

    5. Timeout

    일정 시간 내에 트랜잭션이 종료되지 않으면 롤백한다.

    @Transactional(timeout=10)

     

    보통 하나의 트랜잭션의 시간이 많이 걸리지 않기 때문에,
    timeout를 설정해 두면 오류 발생 시 너무 많은 시간을 잡아먹는 것을 방지할 수 있다.

     

    댓글

Designed by Tistory.