작성
·
236
·
수정됨
0
[질문 내용]
@Transactional
public void accountTransfer(String fromId, String toId, int money) throws SQLException {
bizLogic(fromId, toId, money);
}
public void bizLogic(String fromId, String toId, int money) throws SQLException {
Member fromMember = memberRepository.findById(fromId);
Member toMember = memberRepository.findById(toId);
memberRepository.update(fromId, fromMember.getMoney() - money);
validation(toMember);
memberRepository.update(toId, toMember.getMoney() + money);
}
안녕하세요. 강의 코드와 같이 accountTransfer을 실행했을때 트랜잭션이 잘 작동되어 오류가 발생했을때 롤백이 실행됩니다.
@Transactional
public void accountTransfer(String fromId, String toId, int money) throws SQLException {
Member fromMember = memberRepository.findById(fromId);
Member toMember = memberRepository.findById(toId);
memberRepository.update(fromId, fromMember.getMoney() - money);
validation(toMember);
memberRepository.update(toId, toMember.getMoney() + money);
}
이 코드 또한 그렇습니다.
public void accountTransfer(String fromId, String toId, int money) throws SQLException {
bizLogic(fromId, toId, money);
}
@Transactional
public void bizLogic(String fromId, String toId, int money) throws SQLException {
Member fromMember = memberRepository.findById(fromId);
Member toMember = memberRepository.findById(toId);
memberRepository.update(fromId, fromMember.getMoney() - money);
validation(toMember);
memberRepository.update(toId, toMember.getMoney() + money);
}
하지만 이 코드에서 accountTransfer을 실행했을때 트랜잭션이 작동하지 않습니다.
이유가 무엇일까요?
답변 1
1
안녕하세요. yoona405님, 공식 서포터즈 y2gcoder입니다.
말씀해주신 문제는 @Transactional 은 프록시 방식의 AOP를 적용하기 때문에 발생하는 문제 중 하나입니다!
트랜잭션이 적용되려면 항상 프록시를 거쳐서 호출이 되어야 하는데, @Transactional이 걸리지 않은 메서드 내부에서 @Transactional 이 걸린 메서드를 호출하면 프록시를 거치지 않고 호출하기 때문에 트랜잭션이 작동하지 않습니다!
이 부분에 대해서는 스프링 핵심 원리 - 고급편 의 섹션 13. 스프링 AOP - 실무 주의사항 을 참고해주시면 왜 작동하지 않는 것인지 이해하실 수 있을 거라 생각합니다!
감사합니다.