链式事务api称为spring

时间:2015-01-13 13:30:13

标签: java spring jpa transactional

我有一个问题,我没有得到我的交易提交

我的服务类是@Transactional annotated

@Transactional
class MyService{
   public void find();
   public void return(); //Return will only happen if find is updated in DB
   public void cancel(){
          find();
          return();
   }
}

我的班级有3个api他们在内部调用相应的Dao,而Dao没有注释为Transactional。

现在如果我打电话取消,我会先调用find然后再调用return()。但是return()需要find()需要更新具有FIND状态的DB。

但由于所有事件都发生在同一个交易中,直到取消取消,交易才会被提交。有人可以帮我理解这种情况并解决它。

我不知道如何在这种情况下使用传播。

提前致谢..

1 个答案:

答案 0 :(得分:4)

摘自Spring Transcation文档(Spring Doc

  

在代理模式(默认设置)下,只有外部方法调用   通过代理进入是截获的。这意味着   自调用,实际上是目标对象调用中的一个方法   目标对象的另一种方法,不会导致实际的   即使调用的方法被标记,运行时的事务也是如此   @Transactional。

对cancel()方法内的find()和return()的调用不是事务性的。如果您希望它是交易性的,您可以执行applicationContext.getBean(this.getClass());之类的操作并调用您的方法。