학습테스트를 통해 트랜잭션 전파를 공부해보자.
FirstUserService
, SecondUserService
를 두개 만들고 @Transactional의 propagagion옵션을 바꿔가면서 테스트해보자.
그리고 현재 트랜잭션의 이름과 현재 트랜잭션이 활성화 되어있는지 로그를 찍어 확인하자
FirstUserService: REQUIRED
SecondUserServiceL REQUIRED
각 서비스에서 어떤 트랜잭션이 실행되고 활성화되는지 확인해보자
FirstUserService와 SecoundUserService에서 모두 FirstUserService에서 생성된 트랜잭션이 활성화되고 사용되는 것을 알 수 있다.
REQUIRED 옵션이면 먼저 생성된 트랜잭션 1개로 같이 이용한다.
FirstUserService: REQUIRED
SecondUserServiceL REQUIRED_NEW
각 서비스에서 어떤 트랜잭션이 실행되고 활성화되는지 확인해보자
FirstUserService에선 FirstUserService에서 생긴 트랜잭션이,
SecondUserService에선 SecondUserService에서 생긴 트랜잭션이 사용되는 것을 알 수 있다.
REQUIRED_NEW 옵션이면 새로운 트랜잭션을 만들어 사용한다.
FirstUserService: REQUIRED
SecondUserServiceL REQUIRED_NEW
secondUserService에서 저장된 1개의 user만 commit됨
먼저 생성된 트랜잭션이 rollback되면 이후에 생성된 트랜잭션에 영향을 미치지 않는다.
FirstUserService: REQUIRED
SecondUserService: SUPPORTS
SUPPORTS는 트랜잭션이 있으면 REQUIRED 처럼 동작한다.
FirstUserService: @Transactional이 없음
SecondUserService: SUPPORTS
SUPPORTS는 트랜잭션이 없으면 트랜잭션이 활성화되지 않는다.
FirstUserService: REQUIRED
SecondUserService: MANDATORY
REQUIRED 처럼 동작한다.
FirstUserService: @Transactional 없음
SecondUserService: MANDATORY
SecondUserService에서 예외가 터져서 log는 FirstUserService에만 남았다.
예외가 발생한다.
FirstUserService: REQUIRED
SecondUserService: NOT_SUPPORTED
트랜잭