어노테이션 기반 트랜젝션 (예:<tx:annotation-driven/>) 에서
어떤 클래스에 @Transactional 이 선언되어 있고 이 클래스는 다음과 같은 메서드를 가진다고 할 때
메서드A(){
for(int i=0; i<10; i++){
메서드B();
}
}
메서드A()는 스프링의 프록시로 감싸져 있기 때문에 Exception 발생시 롤백이 가능하지만,
그 안에 있는 메서드B()는 현재 개별적인 트랜젝션처리(각 루프별 독립적 롤백)가
불가능한 상태이다.
이 경우에는 다음과 같이 해결한다.
1. 메서드B()의 정의부에 다음과 같이 선언.
@Transactional(propagation=Propagation.REQUIRES_NEW)
메서드B(){
}
2. 같은 클래스의 다른 bean을 얻어와서 메서드B를 호출한다.
새롭게 얻어온 bean은 메서드A()와는 별개의 스프링 프록시로 감싸지므로
별도의 트랜젝션 처리가 가능해 진다.
ServiceA serviceNew = (ServiceA) ApplicationSetting.getWebApplicationContext().getBean("serviceA");
메서드A(){
for(int i=0; i<10; i++){
serviceNew.메서드B();
}
}