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

时间:2015-03-03 12:42:15

标签: java spring transactions

我有一个服务调用Spring Data CrudRepository。服务方法标记为@Transactional。此方法调用使用@Transactional(propagation = Propagation.REQUIRES_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。

1 个答案:

答案 0 :(得分:0)

请检查您是否已按照详细here启用编译时或加载时编织。

默认模式“proxy”使用Spring的AOP框架处理要注释的注释bean(遵循代理语义,如上所述,仅适用于通过代理进入的方法调用)。替代模式“aspectj”用Spring的AspectJ事务方面​​编织受影响的类,修改目标类字节代码以应用于任何类型的方法调用。 AspectJ编织需要在类路径中使用spring-aspects.jar以及启用加载时编织(或编译时编织)。 (有关如何设置加载时编织的详细信息,请参阅“弹簧配置”一节。)

相关问题