Java Spring嵌套事务-为什么需要清除EntityManager?

Java 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

我有一个服务调用Spring Data
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