같은 클래스 내의 메서드를 내부 호출을 한다면, Advice가 적용되지 않아(즉, TransactionManager가 적용 안됨) 서로 다른 Tx로 인식해서 같은 Tx 내에서 작동 안됨.
public class TxService {
@Autowired A1Dao a1Dao;
@Autowired B1Dao b1Dao;
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public void insertA1WithTx() throws Exception {
a1Dao.insert(1, 100); // 성공
insertB1WithTx(); // 클래스 내의 내부 호출
a1Dao.insert(1, 100); // 실패
}
@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = Exception.class)
public void insertB1WithTx() throws Exception {
b1Dao.insert(1, 100); // 성공
b1Dao.insert(2, 200); // 성공
}
해결 방법은 2가지로
출처 : 남궁성 저자의 스프링의 정석 패스트 캠퍼스