在一个 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
的属性@Transactional
的默认值为REQUIRED
,表示:
支持当前事务,如果不存在则创建一个新事务。
所以是的 - 两种方法都将在同一个事务中运行。
但是一个重要的建议是:不要让你的 DAO 交易。服务应该是事务性的,而不是 DAO。
一注:
在代理模式下(默认),只有通过代理传入的外部方法调用会被拦截。这意味着自调用,实际上是目标对象中的一个方法调用目标对象的另一个方法,在运行时不会导致实际事务,即使调用的方法被标记为@Transactional。