[Spring Boot] Transaction Propagation

Transaction Propagation
REQUIRED
- @Transaction의 디폴트 설정이다.
- 기존에 사용하던 트랜잭션이 있다면 재활용 하고, 없다면 새로운 트랜잭션을 만들어 사용한다.
- 트랜잭션을 재활용(공유)하기 때문에 한 메서드에서 예외가 발생하여 트랜잭션이 롤백된다면 다른 메서드 역시 정상 동작하더라도 함께 롤백되기 때문에 주의해야 한다.
- JpaRepository에서 제공하는 save()메서드에 적용되어 있다. @Transaction을 사용하지 않은 메서드에서 save()메서드가 동작할 때마다 각각의 트랜잭션을 새로 만들어 처리한다.
- 대부분 사용하는 옵션이다.
REQUIRES_NEW
- 이름처럼 기존의 트랜잭션을 재활용하지 않고 무조건 새로운 트랜잭션을 만들어 사용한다.
NESTED
- 호출하는 메서드에 트랜잭션이 존재한다면 그 트랜잭션을 재활용한다. 한 트랜잭션을 사용하므로 종속적이지만 REQUIRED보다 독립적으로 동작한다.
- REQUIRED보다 독립적으로 동작할 수 있는 이유는 save()메서드로 중간 저장을 할 수 있기 때문이다. save()메서드가 실행된 부분까지는 다른 부분에서 예외가 발생하더라도 정상 동작을 보장한다.
SUPPORTS
- REQUIRED와 마찬가지로 호출하는 메서드에 트랜잭션이 존재한다면 그 트랜잭션을 재활용한다.
- 다른 점은 트랜잭션이 없다면 새로 생성하지 않고, 트랜잭션이 없는 상태로 동작한다.
NOT_SUPPORTED
- 호출하는 메서드에 트랜잭션이 존재하더라도 이를 멈추고 트랜잭션이 없는 상태로 동작한다.
MANDATORY
- 필수적으로 트랜잭션이 존재해야 한다. 없으면 오류를 발생시킨다.
NEVER
- 트랜잭션이 없어야 한다. 트랜잭션이 존재한다면 오류를 발생시킨다.