Spring + hibernate,嵌套的NOT_SUPPORTED事务属性

时间:2012-01-09 13:58:43

标签: spring nested commit spring-transactions propagation

public class BusinessService {  //spring bean

  public dumpAllData(List){

    /* Complicated DB operation here
     * We dont want to be in transaction now (because of performance issues)
     */ 

    for(...){           //iterating through whole list
      **updateItem(item);**
    }

  }

  public updateItem(Entity e){
    //saves entity into DB
    //we want to be in transaction now
  }

}

Spring配置:

<tx:advice id="txAdvice" transaction-manager="wsTransactionManager">
    <tx:attributes>           
      <tx:method name="dumpAllData" propagation="NOT_SUPPORTED" />
      <tx:method name="updateItem" propagation="REQUIRES_NEW" />
    </tx:attributes>
</tx:advice>

是否可以嵌套REQUIRED_NEW传播,该传播将从传播NOT_SUPPORTED的方法调用?

我们在dumpAllData()中运行了大量的数据库操作(~100Mb),因此我们不希望处于事务中(另外它会出现性能问题)。但我们希望在updateItem方法中进行事务(回滚/提交)(我们只对实体进行简单更新)。

2 个答案:

答案 0 :(得分:0)

我没有看到在交易中是否存在性能影响。您是否测量过性能差异,或者您只是在猜测?

无论如何,如果你真的需要这样做,那么updateItem方法应该在另一个Spring bean中,注入BusinessService bean。

实际上,当通过代理调用bean方法时,Spring只能启动/提交事务。如果从同一个bean的另一个方法调用bean方法,Spring不能拦截调用并进行事务管理。

答案 1 :(得分:0)

如果从同一类的某个方法调用,则更新方法中的事务注释不会被Spring事务基础结构拦截。有关Spring事务如何工作的更多信息,请参阅Spring Transaction