2010-01-02 4 views
5

논리적 인 대답이있는 것으로 보이지만 확신 할 수는 없지만 확실한 대답은 문서에서 찾을 수 없습니다. 이 시나리오는 다음과 같습니다.어노테이션 기반 및 xml 기반 트랜잭션 정의 우선 순위

<tx:advice id="txAdvice" transaction-manager="jpaTransactionManager"> 
    <tx:attributes> 
     <tx:method name="*" propagation="REQUIRED" /> 
    </tx:attributes> 
</tx:advice> 

모든 서비스 방법을 알려주는 XML 기반 트랜잭션 정의가 있습니다. 그러나 구체적인 클래스/메소드에 을 지정하면 propagation 속성을 덮어 쓰게됩니다.

메서드 수준의 @Transactional은 클래스 수준에서 동일한 수준을 재정의하지만 분명히 <tx:advice> (실제로는 <aop:pointcut>)을 재정의합니까?

내가 두 인터셉터가, 같은 클래스에 생성 (트랜잭션을 시작합니다 먼저하는 일 중) 파고의 조금 후

답변

4

Skaffman에게 감사드립니다.

모두 <aop:advisor>과 (함께 <tx:annotation-driven>와) @Transactional
  1. 가 (방법이 있습니다 트랜잭션에서 실행되는 하나) 대상 클래스 주위에 TransactionInterceptor를 만들 : 마지막으로 내가 행동을 거 같아요.
  2. order 속성이 낮은 조언은 다른 사람보다 우선합니다. 순서 속성을 지정하지 않으면 순서가 정의되지 않습니다. 조언의 두 가지 서로 다른 측면 모두에서 정의

지점을 가입 같은 실행해야하지만 내 시험이 항상 사실이되지 않을 수도 있지만 applicationContext.xml에 최신 정의 된이 우선합니다 것을 보여 주었다 지정하지 않으면 실행 순서가 정의되지 않습니다.

적어도 이것은 봄 2.5.6에 대한 동작입니다. 흥미롭게도, 우리가 예상 한 것처럼 행동합니다.

3

되지 않습니다 희망, 나는 대답은 TxAdviceBeanDefinitionParser.doParse에있다 생각합니다. 논리는 말한다 :

그 강력하고 <tx:attributes>이 지정되지 않은 경우에만, 그래서 우선적 수없는 경우 <tx:advice>@Transactional 상담 것을 나에게 제안, @TransactionalAnnotationTransactionAttributeSource이다 읽는 유일한 감안할 때
if <tx:attributes> is present then 
    parse <tx:attributes> 
else 
    instantiate an AnnotationTransactionAttributeSource to determine TX attributes 

.

이것은 스프링의 일반적인 "가장 덜 놀랄만 한 원칙"접근 방식과 모순되는 것처럼 보입니다. 필자는 주석이 클래스 별 또는 메소드별로 우선 할 것으로 예상했기 때문입니다. JIRA에이 문제를 제기하여이 동작을 변경했습니다.

이 모든 것을 말하면서, 나는 아직도 다른 메커니즘에 의해 작동 할 수 있기 때문에 이것이 무엇을하는지 알아볼 가치가 있다고 생각합니다.

+0

이제는 TxAdviceBeanDefinitionParser에 무엇이 더 있는지 알아보기 위해 일부 파기도 할 것입니다. – Bozho

+0

'TxAdviceBeanDefinitionParser'에 의해 생성 된 프록시가 호출 될 때 주석을 위해 타겟 빈을 검사하는지 궁금합니다. – skaffman

+0

생성되는 두 개의 TransactionInterceptors에 대한 내 추측은 사실입니다. 나는 봄 포럼에서 (새로운 발견을 포함하여) 질문을했고 결과를 계속 업데이트 할 것이다. – Bozho