我有一个服务调用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。
答案 0 :(得分:0)
请检查您是否已按照详细here启用编译时或加载时编织。
默认模式“proxy”使用Spring的AOP框架处理要注释的注释bean(遵循代理语义,如上所述,仅适用于通过代理进入的方法调用)。替代模式“aspectj”用Spring的AspectJ事务方面编织受影响的类,修改目标类字节代码以应用于任何类型的方法调用。 AspectJ编织需要在类路径中使用spring-aspects.jar以及启用加载时编织(或编译时编织)。 (有关如何设置加载时编织的详细信息,请参阅“弹簧配置”一节。)