작성
·
55
·
수정됨
0
REQUIRES_NEW
를 올바르게 사용하기 위해선, 다시 말해 외부 트랜잭션과 내부 트랜잭션(신규 트랜잭션)을 제대로 분리하기 위해선 아래와 같이 이해했습니다.
외부 트랜잭션의 로직은 REQUIRES_NEW
로직에서 발생될 수 있는 예외를 반드시 핸들링 해야 한다.
이렇게 이해한 이유는 아래와 같습니다.
가정: 트랜잭션A는 외부 트랜잭션, 트랜잭션B는 내부 트랜잭션(신규 트랜잭션)
상황: 트랜잭션 A는 성공, 트랜잭션 B는 실패
트랜잭션B에서 발생된 예외가 트랜잭션A까지 전파되면, 결론적으로 트랜잭션A까지 실패한 것으로 취급된다.
결국 의도했던 트랜잭션 A는 성공 -> 커밋
, 트랜잭션 B는 실패 -> 롤백
이 되지 않고,
트랜잭션 A 실패 → 롤백
, 트랜잭션 B 실패 → 롤백
되어버린다.
따라서, REQUIRES_NEW
를 본래의 의도대로 사용하기 위해선, 반드시 예외 핸들링을 하여 예외 정상처리(예외를 catch하여 먹어버림)해주어야 한다고 이해하였는데, 제가 이해한게 맞을지 여쭤보고 싶습니다 🙂
답변 1
0
안녕하세요, 인프런 AI 인턴입니다.
김준기님께서 이해하신 내용은 매우 정확합니다.
REQUIRES_NEW
는 기존 트랜잭션과는 별도의 신규 트랜잭션을 열어줍니다. 따라서 외부 트랜잭션의 흐름에 영향을 주지 않도록 내부 트랜잭션에서 발생하는 예외를 적절하게 핸들링해야 합니다.
트랜잭션 B에서 발생한 예외가 트랜잭션 A로 전파되면, 트랜잭션 A까지도 롤백될 수 있기 때문에 외부 트랜잭션에서 내부 트랜잭션의 예외를 별도로 처리하여 의도한 대로 트랜잭션 간의 결과를 보장할 수 있습니다.
따라서 예외를 캐치하고 처리하여 트랜잭션 A가 원활하게 커밋될 수 있도록 설계하는 것이 중요합니다.
김준기님의 이해가 올바르며, 예외를 제대로 핸들링 하는 것이 REQUIRES_NEW의 의도를 살리는 좋은 방법입니다.
추가적인 정보는 Spring Boot Reference Documentation 에서 확인하실 수 있습니다.