Spring에서는 Transaction이 걸려있는 메소드에서 Transaction 걸려있는 또 다른 메소드를 호출할 때 Transaction이 어떻게 전파될 것인지 결정할 수 있다.
다만 이것은 같은 클래스의 메소드끼리는 해당이 없다. 같은 클래스 내의 메소드 호출시에는 Transaction이 걸려있더라도 그냥 최초 호출한 시점에 시작된 Transaction만으로 진행된다.
@Transactional
기본속성이다. 기존에 생성된 Transaction이 있으면 참여하고 없다면 새로운 Transaction을 생성한다.
이는 결국 @Transactional(propagation = Propagation.REQUIRED) 를 의미한다.
@Transactional(propagation = Propagation.REQUIRES_NEW)
항상 새로운 Transaction을 생성한다.
@Transactional(propagation = Propagation.SUPPORTS)
기존에 생성된 중인 Transaction 이 있을 때만 참여하고 없다면 Transaction 없이 진행한다.
@Transactional(propagation = Propagation.NOT_SUPPORTED)
기존에 생성된 Transaction 이 있든 말든 Transaction 없이 진행한다.
@Transactional(propagation = Propagation.MANDATORY)
이미 진행 중인 Transaction이 있으면 참여한다. 반면에 기존에 생성된 Transaction 이 없다면 예외를 발생시킨다.
※ 혼자서는 독립적으로 트랜잭션을 진행하면 안 되는 경우에 사용한다.
@Transactional(propagation = Propagation.NESTED)
이미 진행 중인 Transaction이 있다면 중첩으로 Transaction이을 생성해서 진행한다. 중첩된 Transaction은 먼저 시작된 부모 Transaction의 commit과 rollback에는 영향을 받지만 자신의 commit과 rollback은 부모 Transaction에 영향을 주지 않는다.
@Transactional(propagation = Propagation.NEVER)
Transaction 없이 진행한다. 이미 진행 중인 Transaction이 있으면 예외를 발생시킨다.
'Backend > Spring+Boot' 카테고리의 다른 글
[Spring Batch] Job flow (0) | 2022.01.04 |
---|---|
readOnly 구분에 따른 커넥션 선택 (0) | 2021.12.15 |
HikariCP 커넥션 풀 (0) | 2021.12.14 |
[SpringBoot] JPA+Kotlin 다중 DB 설정 (0) | 2021.12.09 |
[JPA] SpringBoot JPA 설정 (0) | 2021.12.08 |