在一个dao我有2个@Transactional方法。
如果我不提供任何明确的属性,
然后会发生什么,如果我在另一个体内运行一种方法?
两种方法都在同一个交易中运行?
答案 0 :(得分:12)
使用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...
}
}
答案 1 :(得分:5)
@Transactional
的propagation
属性的默认值为REQUIRED
,表示:
支持当前事务,如果不存在则创建一个新事务。
是的 - 两种方法都将在同一个交易中运行。
但有一个重要的建议:不要让你的DAO事务。服务应该是交易性的,而不是DAO。
答案 2 :(得分:4)
一个注意事项:
在代理模式下(默认设置), 只有外部方法调用进来 通过代理被截获。 这意味着自我调用 效果,目标内的一种方法 对象调用的另一种方法 目标对象,不会导致 即使是运行时的实际事务 调用的方法标有 @Transactional。