@Transactional 메소드 내에서 @Transactional(propagation = Propagation.REQUIRED_NEW) 메소드를 실행하게되면 어떤 일이 발생할까
트랜잭셔널 메소드에서 새로운 트랜잭션을 시작하면 어떤일이 발생하는지 알아보자.
1. 애플리케이션 시작 시 작업
1-1. 트랜잭션 관리자 등록
- 애플리케이션 시작 시 트랜잭션 관리자가 등록된다.
- 트랜잭션 전파 정책(Propagation)을 처리할 수 있도록 AOP 프록시가 생성된다.
1-2. AOP 프록시 생성
@Transactional
이 적용된 메소드에 대해 프록시가 생성된다.- 각각의 메소드가 호출될 때 전파 정책을 해석하도록 설정된다.
2. 부모 매소드 실행(@Transactional, REQUIRED 전파 정책)
2-1. 트랜잭션 시작
- 부모 메소드가 호출되면 프록시가 트랜잭션 관리자를 통해 트랜잭션을 시작
- 트랜잭션 전파 정책
Propagation.REQUEIRED
의 기본 동작에 따라 기존 트랜잭션이 없으면 새 트랜잭션을 시작. - 데이터베이스 연결이 확보되고,
auto-commit
이 비활성화됨
2-2. 비지니스 로직 실행 중 자식 메소드 호출
- 부모 메소드 내에서
Propagation.REQUIRED_NEW
가 적용된 자식 메소드가 호출됨.
3.자식 메소드 실행(@Transactional, Propagation.REQUIRED_NEW)
3-1. 부모 트랜잭션 일시 중단
- 자식 메소드가 호출되면 부모 트랜잭션이
일시중단
상태로 변경됨. - 일시 중단된 트랜잭션은 컨텍스트에 보관되며, 자식 메소드가 끝날때까지 대기.
3-2. 새로운 트랜잭션 시작
- 자식 메소드는 항상 별도의 트랜잭션에서 실행
- 트랜잭션 관리자가 새로운 데이터베이스 연결을 확보하거나 기존 연결을 재사용 하여 별도 트랜잭션을 시작.
- 새로운 트랜잭션은 부모 트랜잭션과 독립적으로 커밋 또는 롤백될 수 있다.
3-3. 비지니스 로직 실행
- 자식 메소드의 비지니스 로직이 새로운 트랜잭션 내에서 실행됨.
- 데이터베이스 작업은 자식 트랜잭션의 컨텍스트에서만 적용됨.
3-4. 자식메소드 종료
- 자식 메소드 실행이 끝나면 아래와 같은 동작 발생
- 정상종료시, 커밋
- 예외 발생시 자식 트랜잭션롤백
4. 부모 메소드 재개
4-1. 부모 트랜잭션 복구
- 자식 메소드 실행이 끝난 후, 무보 트랜잭션이
일시중단
상태에서 복구됨. - 부모 트랜잭션은 자식 트랜잭션과는 독립적으로 계속 진행됨.
4-2. 부모 메소드 비지니스 로직 실행(남은 작업)
- 부모 메소드의 나머지 비지니스 로직 실행.
- 데이터베이스 작업은 부모 트랜잭션 컨텍스트에 반영.
4-3 부모 메소드 종료
- 부모 메소드 종료되면 아래와 같은 동작 발생
- 정상 종료시 커밋
- 예외 발생시 부모 트랜잭션 롤백
5. 특이 케이스
5-1. 자식 트랜잭션 커밋 후 부모 트랜잭션 롤백
- 부모 트랜잭션이 나중에 롤백 되더라도 자신 트랜잭션은 독립적으로 커밋 되었기 때문에 영향을 받지 않는다.
5-2. 자식 트랜잭션 롤백 후 부모 트랜잭션 정상 종료
- 자식 트랜잭션이 실패하면 부모 트랜잭션은 이를 감지할 수 없다.
- 단, 예외를 명시적으로 처리한다면 감지시킬 수 있다.
- 부모 트랜잭션은 독립적으로 커밋 또는 롤백된다.
정리:
- 부모 메소드(@Transactional, Propagation.REQUIRED)가 호출되며 트랜잭션이 시작됨.
- 자식 메소드(@Transactional, Propagation.REQUIRED_NEW)가 호출되면 부모 트랜잭션 일시중단.
- 자식 메소드는 새로운 트랜잭션에서 실행되며 독립적으로 커밋 또는 롤백됨
- 자식 메소드 실행 후, 부모 트랜잭션이 북구되어 남은 로직 실행
- 자식과 부모 트랜잭션은 서로 독립정이며, 서로의 성공 여부에 영향을 주지 않음.
이런 구조로 트랜잭션간의 독립성이 보장되며, 필요 시점에 새로운 트랜잭션을 생성해 데이터 무결성을 관리하는데 도움이 된다.
'프로그래밍 > 면접대비문제' 카테고리의 다른 글
@Transactional 어노테이션이 있는메소드, 스프링 시작부터 메소드 시작까지의 작업 (1) | 2024.11.30 |
---|---|
스프링 부트 어플리케이션이 실행되면 어떤 일들이 일어나는가. (0) | 2024.11.30 |
이터레이터(Iterator) (0) | 2021.01.11 |
Interface VS Abstract (0) | 2021.01.11 |
WAS의 동작방식 (0) | 2021.01.11 |