Spring에서 트랜젝션 내에 별도의 트랜젝션을 가져가는 방법 (Spring 2.5 / 어노테이션 기반 트랜젝션)

By | 6월 22, 2011

어노테이션 기반 트랜젝션 (예:<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();

    } 

}

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments