0

我有 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() {
    ...
  }
}
4

2 回答 2

1

是的,Transaction支持是线程绑定的。当method2()正在执行时,它会以相同的方式执行,Thread因此可以访问当前的Transaction. 也是如此method3()

于 2013-10-09T03:19:04.980 回答
1

@Transactional 的工作原理如下

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

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

另一个方法();

}

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

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

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

希望你现在清楚

于 2013-10-09T03:21:17.240 回答