2012-01-19 4 views
0

나는 스프링 거래와 aop로 학습 단계에 있으며, 약간의 오해가있다 :
1. aop-advice를 사용하지 않고 각 서비스에 대해 다음과 같이 지정한다 :
봄 거래와 AOP

@Transactional (rollbackFor = java.lang.Exception.class 읽기 전용 = TRUE)

하고 난 봄 보면 모든 것이 예상대로 작동하는 것 같다 로그인합니다. 내가 말하고자하는 것은 트랜잭션이 생성되고, 예외가 발생하면 롤백이 발생한다는 것입니다. u는 같은 것을 사용한다면 :

: 그래서

<bean id="txManagerVA" class="org.springframework.orm.jpa.JpaTransactionManager"> 
      <property name="entityManagerFactory" ref="emfVA" />   
     </bean> 

     <tx:annotation-driven transaction-manager="txManagerVA" /> 
<aop:config> 
    <aop:pointcut id="transactionalServiceMethodsVA" expression="execution(* xxx.services.vs.*.*(..))"/> 
    <aop:advisor advice-ref="txManagerVAAdvice" pointcut-ref="transactionalServiceMethodsVA"/> 
</aop:config> 

<tx:advice id="txManagerVAAdvice" transaction-manager="txManagerVA"> 
    <tx:attributes> 
    <tx:method name="get*" rollback-for="java.lang.Exception" read-only="true"/>  
    <tx:method name="*" rollback-for="java.lang.Exception" /> 
    </tx:attributes> 
</tx:advice> 

을 내가 봄 로그를 볼 때,이 시나리오를 사용하여, 롤백 후 내가 좋아하는 뭔가를 얻을 수 있기 때문에, 다른 안쪽에, 2 트랜잭션이 보인다

(IntermedServiceImpl.java:45) - WE HAVE AN EXCEPTION !!!! nullCrocodilu 
(TransactionAspectSupport.java:406) - Completing transaction for [xxx.IntermedServiceImpl.getIntermed] after exception: java.lang.Exception: Crocodilu 
(RuleBasedTransactionAttribute.java:130) - Applying rules to determine whether transaction should rollback on java.lang.Exception: Crocodilu 
(RuleBasedTransactionAttribute.java:147) - Winning rollback rule is: RollbackRuleAttribute with pattern [java.lang.Exception] 
(AbstractPlatformTransactionManager.java:935) - Triggering beforeCompletion synchronization 
(TransactionSynchronizationManager.java:243) - Removed value [org.springframework.orm.jpa.Ex[email protected]63fd1f47] for key [[email protected]] from thread [thread-pool-1-8080(6)] 
(AbstractPlatformTransactionManager.java:843) - Initiating transaction rollback 
//SO FAR SO GOOD 
(JpaTransactionManager.java:533) - Rolling back JPA transaction on EntityManager [[email protected]] 
(AbstractPlatformTransactionManager.java:964) - Triggering afterCompletion synchronization 
(TransactionSynchronizationManager.java:331) - Clearing transaction synchronization 
(TransactionSynchronizationManager.java:243) - Removed value [[email protected]] for key [org[email protected]7ed30037] from thread [thread-pool-1-8080(6)] 
(JpaTransactionManager.java:593) - Closing JPA EntityManager [[email protected]] after transaction 
(EntityManagerFactoryUtils.java:343) - Closing JPA EntityManager 
--> (AbstractPlatformTransactionManager.java:1012) - Resuming suspended transaction after completion of inner transaction <-- 
(TransactionSynchronizationManager.java:272) - Initializing transaction synchronization 
(TransactionAspectSupport.java:406) - Completing transaction for [xxx.IntermedServiceImpl.getIntermed] after exception: java.lang.Exception: Crocodilu 
(RuleBasedTransactionAttribute.java:130) - Applying rules to determine whether transaction should rollback on java.lang.Exception: Crocodilu 
(RuleBasedTransactionAttribute.java:147) - Winning rollback rule is: null 
(RuleBasedTransactionAttribute.java:152) - No relevant rollback rule found: applying default rules 
(AbstractPlatformTransactionManager.java:922) - Triggering beforeCommit synchronization 
(AbstractPlatformTransactionManager.java:935) - Triggering beforeCompletion synchronization 
(AbstractPlatformTransactionManager.java:752) - Initiating transaction commit 
(JpaTransactionManager.java:507) - Committing JPA transaction on EntityManager [[email protected]] 
(AbstractPlatformTransactionManager.java:948) - Triggering afterCommit synchronization 
(AbstractPlatformTransactionManager.java:964) - Triggering afterCompletion synchronization 
(TransactionSynchronizationManager.java:331) - Clearing transaction synchronization 
(TransactionSynchronizationManager.java:243) - Removed value [[email protected]] for key [org[email protected]6012b597] from thread [thread-pool-1-8080(6)] 
(JpaTransactionManager.java:593) - Closing JPA EntityManager [[email protected]] after transaction 
(EntityManagerFactoryUtils.java:343) - Closing JPA EntityManager 

거기에서 볼 수 있듯이 내가 이해할 수없는 줄을 표시했습니다.

그리고 두 번째 문제 : 같은 로그 파일 i`ve에서 같은 라인주의 :

<property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"> 
      <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> 
     </bean> 
    </property> 
:

(JpaTransactionManager.java:407) - Not exposing JPA transaction [[email protected]] as JDBC transaction because JpaDialect [[email protected]] does not support JDBC Connection retrieval 

을 그리고 난 조금 봤 한이 추가 후

entitymanager bean, 이제는 jpa가 트랜잭션을 jdbc 트랜잭션에 노출시키는 것 같습니다. 문제는이 구성의 장점/단점이 무엇인지 모르겠습니다.

답변

0

문제는 XML 트랜잭션 구성 (aop 부분)과 주석 트랜잭션 구성 (@Transactional (rollbackFor = java.lang.Exception.class, readOnly = true)) 부분을 모두 사용하는 것 같습니다. 주석을 제거하면 모든 것이 정상적으로 작동합니다.