0

我有这种情况:

@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 写入的更新数据
  • 我希望如果方法 2 中存在异常,则回滚只关注由方法 2() 所做的修改,而不是由测试类的 mainMethod 所做的回滚修改。我需要读取测试类的 mainMethod 写入的更新数据

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

如果我使用传播 REQUIRES_NEW 我实现了第二个请求,但不是第一个。

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

4

1 回答 1

0

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

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

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

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

希望这会有所帮助

于 2014-01-07T17:57:55.463 回答