我有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() {
...
}
}
答案 0 :(得分:1)
是的,Transaction
支持是线程绑定的。执行method2()
时,它会在同一个Thread
中执行,因此可以访问当前的Transaction
。 method3()
也是如此。
答案 1 :(得分:1)
@Transactional的工作方式如下
如果在任何方法上标记了它,那么我们可以指定一个名为propagation的属性,其默认值或RequiredNew值可以是。
样本是 @Transactional(readOnly = true,propagation = Propagation.REQUIRES_NEW) public void somemethod(){
anotherMethod();
}
如果属性只是“必需”,那么默认情况下,无论你是否在每种方法中声明@transactional,它都会为所有方法的整个传播维护一个事务。
所以所有方法执行都在同一个事务中,如果在最后一个方法中发生任何回滚,它会影响所调用的方法。
如果属性设置为“RequiredNew”,则每个方法都在自己的转换中运行,因此在一个方法中回滚不会回滚其他方法的转换。
希望你现在清楚