SPRING

[SPRING] Transaction Propagation

집한구석 2021. 9. 22. 17:16
728x90

스플링에서는 트랜잭션 처리를 지원하는데, @Transactional 어노테이션을 통하여 선언적 트랜잭션 처리 방식을 지원함, 해당 어노테이션의 옵션엔 propagation이라는 것이 있는데 해당 옵션은 트랜잭션 전파 방식을 설정하게 해줌 


Transaction Propagation (트랜잭션 전파옵션)

  • 트랜잭션 동작 도중 다른 트랜잭션을 호출하는 상황에서 선택할 수 있는 옵션
  • 트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법에 대해 결정하는 속성을 지정하는 옵션 (트랜잭션 흐름을 컨트롤 하는 옵션)

Transaction Propagation 종류

REQUIRED (default) 이미 시작된 트랜잭션이 있으면 참여하고 없으면 새로 시작
REQUIRES_NEW 항상 새로운 트랜잭션으로 시작, 진행중인 트랜잭션이 있으면 보류
SUPPORTS 이미 시작된 트랜잭션이 있으면 참여하고, 그렇지 않으면 트랜잭션 없이 진행
MANDATORY 이미 시작된 트랜잭션이 있으면 참여하고, 없으면 새로 시작하는 대신 예외 발생시킴, 혼자서 독립적으로 트랜잭션을 진행하면 안되는 경우에 사용
NESTED 중첩된 트랜잭션은 먼저 시작된 부모트랜잭션의 커밋과 롤백에 영향을 받지만, 자신의 커밋과 롤백은 부모 트랜잭션에게 영향을 주지 않음 
NOT_SUPPORTED 트랜잭션 사용하지 않음, 이미 진행중인 트랜잭션이 있으면 보류
NEVER 트랜잭션을 사용하지 않도록 강제함, 이미 진행중인 트랜잭션이 있으면 예외 발생

REQUIRED

REQUIRED 설정

  • A, B 설정은 둘다 REQUIRED
  • A라는 부모 트랜잭션이 먼저 존재 하기 때문에 B는 A 트랜잭션에 합류
  • 중간 롤백 발생시 둘다 하나의 트랜잭션이라 모두 롤백됨

REQUIRES_NEW

REQUIRES_NEW 설정

  • A는 REQUIRED, B는 REQUIRES_NEW로 설정
  • 서로 새로운 트랜잭션이 생성되며, 각각 트랜잭션이 롤백되도 영향이 없음

MANDATORY

MANDATORY 설정

  • A는 REQUIRED, B는 MADATORY로 설정
  • 실행 로직 1은 B가 부모트랜잭션인 A에 합류
  • 실행 로직 2는 부모트랜잭션이 존재하지 않아 예외 발생 시킴

NESTED

NESTED 설정

  • A는 REQUIRED, B는 NESTED
  • 부모 트랜잭션이 있으면 중첩트랜잭션 생성, 해당 중첩트랜잭션은 부모 트랜잭션이 커밋될때 커밋
  • 중첩트랜잭션 종료 후, 부모 트랜잭션에서 롤백 발생시 전체 롤백이 됨 

'SPRING' 카테고리의 다른 글

[SPRING] JPA 쿼리메소드 요약  (0) 2022.04.19
[SPRING] Bean 생명주기 콜백 (PostConstruct / PreDestory)  (0) 2022.03.02
[SPRING] AOP  (0) 2021.07.31
[SPRING] Interceptor  (0) 2021.07.11
[SPRING] DISPATCHER-SERVLET  (0) 2021.06.07