← 질문 목록
#384깊이 0
부모 트랜잭션과 무관하게 동작하려면 어떤 전파 속성을 쓰는가?
프레임워크
REQUIRES_NEW 전파 속성을 쓴다. 이 속성은 기존 트랜잭션을 일시 정지하고 항상 새로운 물리 트랜잭션을 만든다.
- 1. 부모 트랜잭션에서 자식 트랜잭션으로: REQUIRES_NEW 호출 (부모 일시 정지)
- 2. 자식 트랜잭션에서 자식 트랜잭션으로: 독자 커밋 또는 롤백 완료
- 3. 부모 트랜잭션에서 부모 트랜잭션으로: 부모 트랜잭션 재개 및 완료
기본값인 REQUIRED는 부모 트랜잭션에 참여한다. 참여한 자식 트랜잭션에서 예외가 발생하면 부모까지 모두 롤백된다. 로그 기록처럼 본문 로직과 무관하게 성공해야 하는 작업에는 REQUIRES_NEW를 쓴다.
이 속성을 쓸 때는 커넥션 고갈을 경계해야 한다. 자식 트랜잭션이 수행되는 동안 부모 트랜잭션의 커넥션도 대기 상태로 유지된다. 동시 요청이 몰리면 커넥션 풀의 자원이 부족해져 시스템이 멈출 수 있다.
두 트랜잭션을 완전히 분리하려면 호출 방식도 주의해야 한다. 같은 클래스 내부에서 메서드를 호출하면 프록시를 거치지 않아 전파 속성이 동작하지 않는다. 외부 클래스의 메서드로 분리해 호출해야 프록시가 새 트랜잭션을 적용한다.