我有一个问题,我没有得到我的交易提交
我的服务类是@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。
但由于所有事件都发生在同一个交易中,直到取消取消,交易才会被提交。有人可以帮我理解这种情况并解决它。
我不知道如何在这种情况下使用传播。
提前致谢..
答案 0 :(得分:4)
摘自Spring Transcation文档(Spring Doc)
在代理模式(默认设置)下,只有外部方法调用 通过代理进入是截获的。这意味着 自调用,实际上是目标对象调用中的一个方法 目标对象的另一种方法,不会导致实际的 即使调用的方法被标记,运行时的事务也是如此 @Transactional。
对cancel()方法内的find()和return()的调用不是事务性的。如果您希望它是交易性的,您可以执行applicationContext.getBean(this.getClass());
之类的操作并调用您的方法。