728x90
스플링에서는 트랜잭션 처리를 지원하는데, @Transactional 어노테이션을 통하여 선언적 트랜잭션 처리 방식을 지원함, 해당 어노테이션의 옵션엔 propagation이라는 것이 있는데 해당 옵션은 트랜잭션 전파 방식을 설정하게 해줌
Transaction Propagation (트랜잭션 전파옵션)
- 트랜잭션 동작 도중 다른 트랜잭션을 호출하는 상황에서 선택할 수 있는 옵션
- 트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법에 대해 결정하는 속성을 지정하는 옵션 (트랜잭션 흐름을 컨트롤 하는 옵션)
Transaction Propagation 종류
REQUIRED (default) | 이미 시작된 트랜잭션이 있으면 참여하고 없으면 새로 시작 |
REQUIRES_NEW | 항상 새로운 트랜잭션으로 시작, 진행중인 트랜잭션이 있으면 보류 |
SUPPORTS | 이미 시작된 트랜잭션이 있으면 참여하고, 그렇지 않으면 트랜잭션 없이 진행 |
MANDATORY | 이미 시작된 트랜잭션이 있으면 참여하고, 없으면 새로 시작하는 대신 예외 발생시킴, 혼자서 독립적으로 트랜잭션을 진행하면 안되는 경우에 사용 |
NESTED | 중첩된 트랜잭션은 먼저 시작된 부모트랜잭션의 커밋과 롤백에 영향을 받지만, 자신의 커밋과 롤백은 부모 트랜잭션에게 영향을 주지 않음 |
NOT_SUPPORTED | 트랜잭션 사용하지 않음, 이미 진행중인 트랜잭션이 있으면 보류 |
NEVER | 트랜잭션을 사용하지 않도록 강제함, 이미 진행중인 트랜잭션이 있으면 예외 발생 |
REQUIRED
- A, B 설정은 둘다 REQUIRED
- A라는 부모 트랜잭션이 먼저 존재 하기 때문에 B는 A 트랜잭션에 합류
- 중간 롤백 발생시 둘다 하나의 트랜잭션이라 모두 롤백됨
REQUIRES_NEW
- A는 REQUIRED, B는 REQUIRES_NEW로 설정
- 서로 새로운 트랜잭션이 생성되며, 각각 트랜잭션이 롤백되도 영향이 없음
MANDATORY
- A는 REQUIRED, B는 MADATORY로 설정
- 실행 로직 1은 B가 부모트랜잭션인 A에 합류
- 실행 로직 2는 부모트랜잭션이 존재하지 않아 예외 발생 시킴
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 |