트랜잭션 REQUIRES_NEW 옵션
2022. 12. 18. 19:31ㆍdb
상위 트랜잭션
@Service
@RequiredArgsConstructor
public class ParentService {
private final JpaMemberRepository jpaMemberRepository;
private final ChildService childService;
@Transactional
public void save(Member member) {
System.out.println("parent 트랜잭션 시작");
jpaMemberRepository.save(member);
childService.save();
}
}
하위 트랜잭션
@Service
@RequiredArgsConstructor
public class ChildService {
private final JpaMemberRepository jpaMemberRepository;
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void save() {
System.out.println("child 트랜잭션 시작");
jpaMemberRepository.save(new Member());
throw new IllegalStateException();
}
}
상위 트랜잭션에서 하위 트랜잭션을 호출하고 있는데 하위 트랜잭션에서 unchecked exception이 발생한다. 하위 트랜잭션에서 REQUIRES_NEW 옵션을 사용했기 때문에 두 트랜잭션은 독립적이어야 한다. 하지만 하위 트랜잭션에서 예외가 발생하면서 상위 트랜잭션이 정상적으로 저장이 되지 않는다. 즉 하위 트랜잭션의 예외발생이 상위 트랜잭션까지 전파되고 있으므로 두 트랜잭션이 독립되어있다고 보기 힘들다.
상위 트랜잭션 예외 처리
@Service
@RequiredArgsConstructor
public class ParentService {
private final JpaMemberRepository jpaMemberRepository;
private final ChildService childService;
@Transactional
public void save(Member member) {
System.out.println("parent 트랜잭션 시작");
jpaMemberRepository.save(member);
try {
childService.save();
} catch (IllegalStateException e) {
System.out.println("child 트랜잭션 예외발생");
}
}
}
위와 같이 상위 트랜잭션에서 예외를 처리해준다면 두 트랜잭션은 독립된다.

제대로 동작하는 것을 확인 할 수 있다.