首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >spring事务和AOP

spring事务和AOP
EN

Stack Overflow用户
提问于 2012-01-19 22:27:03
回答 1查看 2.6K关注 0票数 0

我仍然处于spring事务和aop的学习阶段,我有一些误解:

如果我不使用aop-

  • ,我会为每个服务指定如下内容:

@Transactional(rollbackFor=java.lang.Exception.class,readOnly=true)

然后我查看了spring log,一切似乎都像预期的那样工作。我的意思是创建一个事务,在出现异常的情况下,我会得到一个回滚。但是如果你使用类似这样的东西:

代码语言:javascript
复制
    <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>

所以,当我查看spring日志时,使用这个场景,似乎有两个事务,在另一个事务中,因为在回滚之后,我得到了类似于:

代码语言:javascript
复制
(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.ExtendedEntityManagerCreator$ExtendedEntityManagerSynchronization@63fd1f47] for key [org.hibernate.ejb.EntityManagerImpl@4eb35bed] 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 [org.hibernate.ejb.EntityManagerImpl@b3fbd77]
(AbstractPlatformTransactionManager.java:964) - Triggering afterCompletion synchronization
(TransactionSynchronizationManager.java:331) - Clearing transaction synchronization
(TransactionSynchronizationManager.java:243) - Removed value [org.springframework.orm.jpa.EntityManagerHolder@45a27493] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@7ed30037] from thread [thread-pool-1-8080(6)]
(JpaTransactionManager.java:593) - Closing JPA EntityManager [org.hibernate.ejb.EntityManagerImpl@b3fbd77] 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 [org.hibernate.ejb.EntityManagerImpl@405c9cef]
(AbstractPlatformTransactionManager.java:948) - Triggering afterCommit synchronization
(AbstractPlatformTransactionManager.java:964) - Triggering afterCompletion synchronization
(TransactionSynchronizationManager.java:331) - Clearing transaction synchronization
(TransactionSynchronizationManager.java:243) - Removed value [org.springframework.orm.jpa.EntityManagerHolder@1f0cf366] for key [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@6012b597] from thread [thread-pool-1-8080(6)]
(JpaTransactionManager.java:593) - Closing JPA EntityManager [org.hibernate.ejb.EntityManagerImpl@405c9cef] after transaction
(EntityManagerFactoryUtils.java:343) - Closing JPA EntityManager

如您所见,我已经标记了我不理解的行。

第二个问题:在同一个日志文件中,我注意到下面这样的一行:

代码语言:javascript
复制
(JpaTransactionManager.java:407) - Not exposing JPA transaction [org.hibernate.ejb.EntityManagerImpl@b3fbd77] as JDBC transaction because JpaDialect [org.springframework.orm.jpa.DefaultJpaDialect@77acf1c0] does not support JDBC Connection retrieval

我在谷歌上搜索了一下,然后添加了这个:

代码语言:javascript
复制
<property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
            <property name="databasePlatform" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
        </bean>
   </property> 

entitymanager bean,现在看起来jpa将事务公开给jdbc事务。问题是我不知道这种配置的优点/缺点是什么。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-03-02 22:12:07

问题似乎在于我同时使用了xml (面向方面编程部分)和annotation transaction configuration ( (@Transactional(rollbackFor=java.lang.Exception.class,readOnly=true)部分。如果我去掉注释,一切都正常。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8927715

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档