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方法中进行事务(回滚/提交)(我们只对实体进行简单更新)。
答案 0 :(得分:0)
我没有看到在交易中是否存在性能影响。您是否测量过性能差异,或者您只是在猜测?
无论如何,如果你真的需要这样做,那么updateItem
方法应该在另一个Spring bean中,注入BusinessService
bean。
实际上,当通过代理调用bean方法时,Spring只能启动/提交事务。如果从同一个bean的另一个方法调用bean方法,Spring不能拦截调用并进行事务管理。
答案 1 :(得分:0)
如果从同一类的某个方法调用,则更新方法中的事务注释不会被Spring事务基础结构拦截。有关Spring事务如何工作的更多信息,请参阅Spring Transaction。