Spring:我之间应该有@Transactional注释吗?

时间:2013-10-09 01:31:27

标签: java spring transactionscope spring-transactions transactional

我有3个Spring组件调用first-> second-> third。 如果我在第一个和第三个上只有@Transactional注释会使事务正确传播吗?

@Component public class C1 {
  @Autowired C2 c2;

  @Transactional public method1() {
    ...
    c2.method2();
  }
}

@Component public class C2 {
  @Autowired C3 c3;

  public method2() {
    ...
    c3.method3();
  }
}

@Component public class C3 {
  @Transactional public method3() {
    ...
  }
}

2 个答案:

答案 0 :(得分:1)

是的,Transaction支持是线程绑定的。执行method2()时,它会在同一个Thread中执行,因此可以访问当前的Transactionmethod3()也是如此。

答案 1 :(得分:1)

@Transactional的工作方式如下

如果在任何方法上标记了它,那么我们可以指定一个名为propagation的属性,其默认值或RequiredNew值可以是。

样本是 @Transactional(readOnly = true,propagation = Propagation.REQUIRES_NEW) public void somemethod(){

anotherMethod();

}

如果属性只是“必需”,那么默认情况下,无论你是否在每种方法中声明@transactional,它都会为所有方法的整个传播维护一个事务。

所以所有方法执行都在同一个事务中,如果在最后一个方法中发生任何回滚,它会影响所调用的方法。

如果属性设置为“RequiredNew”,则每个方法都在自己的转换中运行,因此在一个方法中回滚不会回滚其他方法的转换。

希望你现在清楚