Transaction
- 데이터베이스의 상태를 변화시키기 해서 수행하는 작업의 단위
- spring에서는 @Transactional 어노테이션을 통해 트랜잭션의 범위를 지정해줄 수 있다.
클래스단, 메서드단의 @Transactional 선언
- 클래스 단에 @Transactional 선언 -> 해당 클래스의 모든 메서드에 @Transactional이 적용된 효과
- 메서드단에 @Transcational 선언 -> 메서드 하나를 트랜잭션으로 보고 메서드 중간에 에러가 생기면 롤백하는 등 처리를 해준다
부모메서드, 자식메서드의 @Transactional 선언
- 부모메서드에 @Transactional선언, 자식 메서드에 @Transactional 선언x
-> 자식메서드에서 select해온 값들은 제대로 불러와지지 않고, 부모메서드에서 select해온 값들은 제대로 불러와짐(이해감)
- 부모메서드에 @Transactional선언x, 자식 메서드에 @Transactional 선언
-> 이런경우 제대로 동작하지 않은다고 들었는데 제껀 왜 값을 잘 받아오는건지 모르겠어요
제가 테스트를 잘못한건가요? 원래 어떻게 되나요?
- 부모메서드에 @Transactional선언, 자식 메서드에 @Transactional 선언
-> 자식 메서드에서 요청한 쿼리도 모두 쌓았다가 부모메서드가끝날때
보내는게 아니라 자식메서드에서 쿼리가 발생하면 자식메서드가 끝날때 쿼리가 날아가는 것 같아요.
제가 테스트 한게 맞을까요?
테스트
트랜잭션 전파
- 전파설정옵션의 기본값에 대해 알아 볼 것이다
부모 트랜잭션이 존재한다면 부모 트랜잭션으로 합류합니다. 부모 트랜잭션이 없다면 새로운 트랜잭션을 생성합니다.
중간에 롤백이 발생한다면 모두 하나의 트랜잭션이기 때문에 진행사항이 모두 롤백됩니다
- 이 사진을 참고하면 2번에 제대로 값이 나오는게 맞는 것 같고, 3번은 자식메서드가 끝날때 쿼리가 날아가는것이 아니라 쌓였다가 부모메서드가 끝날때 쿼리가 나가는 것 같다.
출처
https://deveric.tistory.com/86