【问题标题】:Nested Spring Transaction with Hibernate使用 Hibernate 的嵌套 Spring 事务
【发布时间】:2013-10-18 17:32:39
【问题描述】:

我有这种情况:

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

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

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

我认为唯一的方法是使用 TransactionTemplate 进行手动事务。我的猜想对吗?

【问题讨论】:

    标签: spring jpa spring-transactions


    【解决方案1】:

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

    transactionTemplate.execute(new TransactionCallback<Void>() {
    
            @Override
            public Void doInTransaction(TransactionStatus status) {
    }
    });
    

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

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2011-11-01
      • 2021-11-17
      • 1970-01-01
      • 2016-09-10
      • 2015-11-04
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多