在一个dao中,我有2个@Transactional方法。
如果我没有提供任何显式属性,
那么如果我在另一个方法的主体中运行一个方法,会发生什么?
两个方法将在同一个事务中运行吗?
在一个dao中,我有2个@Transactional方法。
如果我没有提供任何显式属性,
那么如果我在另一个方法的主体中运行一个方法,会发生什么?
两个方法将在同一个事务中运行吗?
在使用Transactional时,你正在处理类的代理对象,因此在这种情况下:
@Transactional
public void doSomeThing(){ // calling this method targets a proxy
doSomeThingElse(); // this method targets the actual class, not the PROXY,
// so the transactional annotation has no effect
}
@Transactional
public void doSomeThingElse(){
}
你正在从外部调用代理,但第二个方法调用是从代理对象内部发起的,因此没有事务支持。 所以无论第二个方法中的@Transactional注释的值如何,它们自然而然地在同一个事务中运行。
因此,如果您需要分开的事务,则必须进行调用。
yourservice.doSomething();
yourservice.doSomethingElse();
来自外部。
整个场景在Spring AOP > Understanding AOP proxies章节中有很好的解释,包括这个“解决方案”:
public class SimplePojo implements Pojo {
public void foo() {
// this works, but... gah!
((Pojo) AopContext.currentProxy()).bar();
}
public void bar() {
// some logic...
}
}
propagation
属性的默认值为 REQUIRED
,意味着:支持当前事务,如果不存在则创建一个新的事务。注:在代理模式下(默认情况下),只有通过代理进行的外部方法调用才会被拦截。这意味着,自我调用实际上是目标对象中调用另一个方法的方法,即使调用的方法标有@Transactional,在运行时也不会导致实际事务。