2012-04-06 3 views
0

메소드 a, b 및 c를 포함하여 @Transactional으로 표시된 여러 가지 메소드가있는 서비스가 있습니다. 이 3 가지 메소드는 다음과 같은 방식으로 중첩됩니다. a -> b -> c.SQL Server 2012에서 Spring @Transactional 및 PROPAGATION_REQUIRES_NEW

@Transactional 
public void a() { 
    while(condition) { 
     try { 
      b(); 
     } catch(MyException e) { 
      logger.warn(e.getMessage()); 
     } 
    } 
} 

B 법은 그러나이 같은 주석된다 : 다음 코드 샘플이다 MyException는 방법 C에서 발생 될 때 종료 할 때

@Transactional(propagation = Propagation.REQUIRES_NEW, rollbackFor = {MyException.class}) 

하지만, 예외는 방법 A에 걸려있다가, 트랜잭션은 완료되고 b()에 대한 호출에 의해 예외가 발생하고 롤백 (?) 된 것이 무엇이든지 포함됩니다. 내가 SQL 서버 2012을 사용하고 봄 3.0.7로 표현하고 내 스프링 구성은 다음과 같이이다 : 보인다 b

<tx:annotation-driven /> 
<bean class="org.springframework.orm.jpa.JpaTransactionManager" id="transactionManager"> 
    <qualifier value="txm1"/> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
</bean> 
<bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="persistenceXmlLocation" value="classpath:META-INF/jpa-persistence.xml"/> 
    <property name="persistenceUnitName" value="Unit1" /> 
</bean> 

답변

2

방법은 방법 a와 같은 클래스에있을 수 있습니다. AspectJ를 사용하지 않는다면, @Transactional의 주석은 JDK 동적 프록시에 의해 처리됩니다.이 프록시를 통해 클래스 외부에서의 호출은 a 메소드로 이동합니다. @Transactional -annotations이 효과가 여기 예를 들어 볼 수 있도록 호출은 '이해 AOP 프록시'에서, 프록시를 통해 이동해야합니다 : http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch08s06.html

여기서 이해해야 할 중요한 건은 그 내부의 클라이언트 코드 Main 클래스의 main (..)에는 프록시에 대한 참조가 있습니다. 이것은 이라는 메서드가 해당 객체 참조를 호출 할 때 프록시에서 호출 할 것이고 이므로 프록시는 해당 특정 메서드 호출과 관련된 모든 인터셉터 (조언)에 위임 할 수 있음을 의미합니다. 그러나 호출이 마침내 대상 객체 인 에 SimplePojo 참조가 도달하면 이 this.bar() 또는 this.foo()와 같이 직접 호출 할 수있는 메서드 호출은 모두 이됩니다. 프록시가 아닌이 참조에 대해 호출됩니다. 이것은 중요한 의미가 있습니다. 자체 호출이 이 아니므로 메소드 호출과 관련된 조언이 실행되어 기회를 얻을 수 있음을 의미합니다.

관련 문제