[Spring]@Transactional-전파레벨(propagation)

윤재열·2022년 5월 18일
0

Spring

목록 보기
60/72
post-custom-banner

@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개의 트랜잭션이 완전 독립적으로 동작한다.
profile
블로그 이전합니다! https://jyyoun1022.tistory.com/
post-custom-banner

0개의 댓글