Java Spring嵌套事务-为什么需要清除EntityManager?
我有一个服务调用Spring DataJava Spring嵌套事务-为什么需要清除EntityManager?,java,spring,transactions,Java,Spring,Transactions,我有一个服务调用Spring DataCrudepository。服务方法标记为@Transactional。此方法调用带有@Transactional(propagation=propagation.REQUIRES\u NEW)注释的私有方法。我使用的是AspectJ模式,因此支持私有方法 伪代码: @Transactional public void updateIt( Object o ) { // call private method that is annotated with
Crudepository
。服务方法标记为@Transactional
。此方法调用带有@Transactional(propagation=propagation.REQUIRES\u NEW)
注释的私有方法。我使用的是AspectJ模式,因此支持私有方法
伪代码:
@Transactional
public void updateIt( Object o )
{
// call private method that is annotated with REQUIRES_NEW
doUpdateInRepo( o );
em.clear(); // Why do I need this here?
// Ask everything from repo again
Collection all = repo.findAll();
notifyListenersOfUpdate(all);
}
@Transactional(propagation=REQUIRES_NEW)
private doUpdateInRepo( o )
{
repo.save( o ) // repo is a CrudRepository
}
我不明白的是,在私有方法之外,但仍然在服务方法内部,嵌套事务中所做的更改是不可见的。只有首先显式调用EntityManager.clear()
时,存储库方法findAll
才会返回更新的结果
知道为什么需要这个clear()
吗?我认为嵌套事务将提交,而外部事务将“看到”事务中所做的所有更改
我使用的是Spring 4.1.5。请检查您是否启用了编译时或加载时编织功能
默认模式“代理”使用Spring的AOP框架处理要代理的带注释bean(遵循代理语义,如上所述,仅应用于通过代理传入的方法调用)。替代模式“aspectj”使用Spring的aspectj事务特性编织受影响的类,修改目标类字节码以应用于任何类型的方法调用AspectJ编织需要类路径中的spring-aspects.jar以及启用的加载时编织(或编译时编织)。(有关如何设置加载时编织的详细信息,请参阅“Spring配置”部分。)您使用哪个transactionmanager?根据要求,并非所有TransactionManager都能立即使用NEW。我认为,如果您不先
clear()
,则findAll()
将只从缓存中获取旧事务。我使用的是JpaTransactionManager