트랜잭션 REQUIRES_NEW 옵션

2022. 12. 18. 19:31db

상위 트랜잭션

@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 트랜잭션 예외발생");
        }
    }
}

위와 같이 상위 트랜잭션에서 예외를 처리해준다면 두 트랜잭션은 독립된다.

 

 

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

'db' 카테고리의 다른 글

데이터 무결성  (0) 2023.01.10
정규화 정리  (0) 2023.01.10
인덱스 정리  (2) 2022.12.21
CQRS  (0) 2022.12.16
트랜잭션  (2) 2022.12.14