Spring @Transactional方法 - 参与交易

时间:2010-05-19 11:34:41

标签: java spring transactions spring-aop spring-transactions

在一个dao我有2个@Transactional方法。

如果我不提供任何明确的属性,

然后会发生什么,如果

我在另一个体内运行一种方法?

两种方法都在同一个交易中运行?

3 个答案:

答案 0 :(得分:12)

Spring AOP中的代理

使用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 一章中详细解释了整个场景,包括这个“解决方案”:

从内部访问当前AOP代理对象

public class SimplePojo implements Pojo {

   public void foo() {
      // this works, but... gah!
      ((Pojo) AopContext.currentProxy()).bar();
   }

   public void bar() {
      // some logic...
   }
}

答案 1 :(得分:5)

@Transactionalpropagation属性的默认值为REQUIRED,表示:

  

支持当前事务,如果不存在则创建一个新事务。

是的 - 两种方法都将在同一个交易中运行。

但有一个重要的建议:不要让你的DAO事务。服务应该是交易性的,而不是DAO。

答案 2 :(得分:4)

Spring doc

一个注意事项:

  

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