@Transactional 사용시 주의사항
- @Transactional을 클래스 또는 메서드 레벨에 명시하면 해당 메서드 호출시 지정된 트랜잭션이 작동하게 됩니다.
- 단, 해당 클래스의 Bean을 다른 클래스의 Bean에서 호출할 때만 @Transactional을 인지하고 작동하게 됩니다.
Propagation.REQUIRED
@Transactional(propagation = Propagation.REQUIRED)
public void doSomething(){
....
}
- default 값이기 때문에 생략이 가능합니다.
- 부모 트랜잭션 내에서 실행하며, 부모 트랜잭션이 없을 경우 새로운 트랜잭션 생성
- 해당 메서드를 호출한 곳에서 별도의 트랜잭션이 설정되어 있지 않다면 트랜잭션을 새로 시작합니다.
- 만약, 호출한 곳에서 이미 트랜잭션이 설정되어 있다면 기존의 트랜잭션 내에서 로직을 실행합니다.(동일한 연결 안에서 실행됩니다.)
- 예외가 발생하면 롤백이 되고 호출한 곳에도 롤백이 전파됩니다.
Propagation.REQUIRES_NEW
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doSomeThing() {
...
}
- Propagation.REQUIRES_NEW로 설정되어있을 때에는 매번 새로운 트랜잭션을 시작한다. (새로운 연결을 생성하고 실행)
- 만약, 호출한 곳에서 이미 트랜잭션이 설정되어 있다면(기존 연결이 있다면) 기존의 트랜잭션은 메소드가 종료할 때까지 잠시 대기 상태로 두고 자신의 트랜잭션을 실행한다.(부모 트랜잭션 상관X)
- 새로운 트랜잭션 안에서 예외가 발생해도 호출한 곳에는 롤백이 전파되지 않는다.
- 즉, 2개의 트랜잭션이 완전 독립적으로 동작한다.