5

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

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

那么会发生什么,如果

我在另一种方法的主体中运行一种方法?

两种方法都将在同一事务中运行?

4

3 回答 3

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...
   }
}
于 2010-05-19T15:44:48.570 回答
5

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

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

所以是的 - 两种方法都将在同一个事务中运行。

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

于 2010-05-19T11:41:05.000 回答
4

春季文档

一注:

在代理模式下(默认),只有通过代理传入的外部方法调用会被拦截。这意味着自调用,实际上是目标对象中的一个方法调用目标对象的另一个方法,在运行时不会导致实际事务,即使调用的方法被标记为@Transactional。

于 2010-05-19T11:45:21.277 回答