使用Hibernate嵌套Spring事务

时间:2013-10-18 17:32:39

标签: spring jpa spring-transactions

我遇到这种情况:

@Component @Transactional
public class Test{

     public void mainMetod(){
        //do some changes on db

        classA.method1();

        classA.method2();
     }  

}

@Component @Transactional
public class A{

      public method1(){
           //read some data from db that Test class wrote
      }


      public method2(){
           //read some data from db that Test class wrote 
      }
}

和app-jpa-config.xml

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <!-- <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> -->
    <property name="entityManagerFactory" ref="entityManagerFactory" />
    <property name="dataSource" ref="dataSource" />
</bean>

<tx:annotation-driven />

我尝试实现此行为:

  • 我希望A类的method1可以看到在Test类的mainMetod中编写的数据
  • 我希望如果在method1中存在异常,则只返回由method1()进行的回滚兴趣修改,而不是由Test类的mainMethod进行的回滚修改。 我需要读取由测试类
  • 的mainMethod写的更新数据
  • 我想如果在method2中有一个异常,则只返回由method2()进行的回滚兴趣修改,而不是由Test类的mainMethod进行的回滚修改。 我需要读取由测试类
  • 的mainMethod写的更新数据

如果我使用默认传播,我会到达第一个请求(可以读取mainmethod写的数据),但我无法实现第二个请求:在method1 / 2回滚整个事务中回滚。

如果我使用传播REQUIRES_NEW我实现了第二个请求,但没有实现。

我认为唯一的方法是使用TransactionTemplate使用手动事务。我的假设是正确的吗?

1 个答案:

答案 0 :(得分:0)

Hibernate不支持嵌套事务注释。所以解决我发现的问题的唯一方法是使用TransactionTemplate。

transactionTemplate.execute(new TransactionCallback<Void>() {

        @Override
        public Void doInTransaction(TransactionStatus status) {
}
});

doInTransaction方法中的所有代码都在事务上下文中执行。因此,通过这种方式,我可以手动管理方法提交结果的确切位置。

希望这会有所帮助