트랜잭션 전파(Transaction Propagation) 학습테스트

조현근·2022년 11월 8일
0

학습테스트를 통해 트랜잭션 전파를 공부해보자.
FirstUserService, SecondUserService를 두개 만들고 @Transactional의 propagagion옵션을 바꿔가면서 테스트해보자.
그리고 현재 트랜잭션의 이름과 현재 트랜잭션이 활성화 되어있는지 로그를 찍어 확인하자

REQUIRED

시나리오

FirstUserService: REQUIRED
SecondUserServiceL REQUIRED
각 서비스에서 어떤 트랜잭션이 실행되고 활성화되는지 확인해보자

학습테스트

Log

FirstUserService와 SecoundUserService에서 모두 FirstUserService에서 생성된 트랜잭션이 활성화되고 사용되는 것을 알 수 있다.

결론

REQUIRED 옵션이면 먼저 생성된 트랜잭션 1개로 같이 이용한다.

REQUIRED NEW

시나리오

FirstUserService: REQUIRED
SecondUserServiceL REQUIRED_NEW
각 서비스에서 어떤 트랜잭션이 실행되고 활성화되는지 확인해보자

학습테스트

Log

FirstUserService에선 FirstUserService에서 생긴 트랜잭션이,
SecondUserService에선 SecondUserService에서 생긴 트랜잭션이 사용되는 것을 알 수 있다.

결론

REQUIRED_NEW 옵션이면 새로운 트랜잭션을 만들어 사용한다.

REQUIRED_NEW, RollBack

시나리오

FirstUserService: REQUIRED
SecondUserServiceL REQUIRED_NEW

  1. firstUserService에서 secondUserService의 메서드 호출
  2. secondUserService에서 user 저장
  3. firstUserService에서 user 저장
  4. firstUserService에서 예외 발생
  5. 테스트코드에서 총 저장된 user의 개수를 확인

테스트 결과

secondUserService에서 저장된 1개의 user만 commit됨

학습테스트

결론

먼저 생성된 트랜잭션이 rollback되면 이후에 생성된 트랜잭션에 영향을 미치지 않는다.

SUPPORTS

FirstUserService에 @Transactional이 있음

시나리오

FirstUserService: REQUIRED
SecondUserService: SUPPORTS

학습테스트

Log

결론

SUPPORTS는 트랜잭션이 있으면 REQUIRED 처럼 동작한다.

FirstUserService에 @Transactional이 없음

시나리오

FirstUserService: @Transactional이 없음
SecondUserService: SUPPORTS

학습테스트

Log

결론

SUPPORTS는 트랜잭션이 없으면 트랜잭션이 활성화되지 않는다.

MANDATORY

FirstUserService에 @Transactional 있음

시나리오

FirstUserService: REQUIRED
SecondUserService: MANDATORY

학습테스트

Log

결론

REQUIRED 처럼 동작한다.

FirstUserService에 @Transactional 없음

시나리오

FirstUserService: @Transactional 없음
SecondUserService: MANDATORY

학습테스트

Log

SecondUserService에서 예외가 터져서 log는 FirstUserService에만 남았다.

결론

예외가 발생한다.

NOT_SUPPORTED

FirstUserService에 @Transactional 존재

시나리오

FirstUserService: REQUIRED
SecondUserService: NOT_SUPPORTED

학습테스트

Log

결론

트랜잭

profile
안녕하세요!

0개의 댓글