Spring Framework의 트랜잭션 전파속성
트랜잭션을 시작하거나 기존 트랜잭션에 참여하는 방법을 결정하는 속성이다. 트랜잭션 경계의 시작지점에서 트랜잭션 전파 속성을 참조해서, 해당 범위의 트랜잭션을 어떤 식으로 진행 시킬 지 결정 할 수 있다.
스프링이 지원하는 트랜잭션 전파속성은 여섯가지가 있다. 모든 속성이 트랜잭션 매니저, 데이터 액세스 기술과 지원되지는 않으니 주의해야 한다.
- Required (default)
- Supports
- Mandatory
- Requires new
- Not supported
- Never
- Nested
Required
기본 속성. 모든 트랜잭션 매니저가 지원한다. 미리 시작 된 트랜잭션이 있으면 참여하고, 없으면 새로 시작한다.
트랜잭션이 시작 된 후에 다른 트랜잭션 경계가 설정된 메소드를 호출하면 같은 트랜잭션으로 묶인다.
// REQUIRED
@Transactional
A(){
B()
}
@Transactional(propagation=Propagation.REQUIRED)
B(){
}
- A && B 성공 : A, B 성공
- A || B 실패 : A, B 실패
Supports
이미 시작된 트랜잭션이 있으면 참여하고, 그렇지 않으면 트랜잭션 없이 진행한다.
Mandatory
이미 시작된 트랜잭션이 있으면 참여한다. 시작된 트랜잭션이 없으면 예외를 발생 시킨다. 독립적으로 트랜잭션을 진행하면 안되는 경우에 사용한다.
// MANDATORY
@Transactional
A(){
B()
}
A-2(){
B()
}
@Transactional(propagation=Propagation.MANDATORY)
B(){
}
- A : 정상 동작(Required와 동일)
- A-2 : 예외 발생
Requires new
항상 새로운 트랜잭션을 시작한다. 이미 진행중인 트랜잭션은 잠시 보류시키고 새로운 트랜잭션을 시작한다. 이전 트랜잭션과 다음 트랜잭션은 별도로 동작한다.
// REQUIRES_NEW
@Transactional
A(){
B()
}
@Transactional(propagation=Propagation.REQUIRES_NEW)
B(){
}
- A && B 성공 : A, B 성공
- A 성공, B 실패 : A 성공, B 실패
- A 실패, B 성공 : A 실패, B 성공
Not supported
트랜잭션을 사용하지 않는다. 이미 진행중인 트랜잭션이 있으면 보류시킨다.
Never
트랜잭션을 사용하지 않도록 강제한다. 이미 트랜잭션이 진행중이면, 예외를 발생시킨다.
// NEVER
@Transactional
A(){
B()
}
A-2(){
B()
}
@Transactional(propagation=Propagation.NEVER)
B(){
}
- A : 예외 발생
- A-2 : 정상 동작
Nested
이미 진행중인 트랜잭션이 있으면, 중첩 트랜잭션을 시작한다.
상위 트랜잭션은 하위 트랜잭션에 영향을 주지만, 하위 트랜잭션의 결과는 상위 트랜잭션의 결과에 영향을 끼치지 않는다.
// NESTED
@Transactional
A(){
B()
}
@Transactional(propagation=Propagation.NESTED)
B(){
}
- A && B 성공 : A, B 성공
- A 성공, B 실패 : A 성공, B 실패
- A 실패, B 성공 : A 실패, B 실패
참조
'Spring' 카테고리의 다른 글
컨테이너와 IoC, DI 란? (0) | 2021.02.17 |
---|