当从另一个实例中的事务方法调用 spring 非事务方法时,事务是否会传播?

Mar*_*c B 3 java spring spring-jdbc spring-transactions

抱歉,如果之前已经讨论过这个问题,但我在 @Transactional spring java 注释的所有相关讨论中找不到答案。

如果我们从具有 @Transactional 注释的方法调用另一个没有 @Transactional 注释的实例中的方法,会发生什么情况?@Transactaional 注解的方法中的事务会被挂起吗?或者会被传播吗?

我发现了很多关于对第二个方法的调用是否来自同一个实例的讨论,但如果第二个非事务性方法位于另一个实例中则没有。感谢您的帮助!

就像下面的例子一样,如果从 A 类中的 methoda() 调用 B 类中的 methodb() 会发生什么?来自 methoda 的事务会传播还是 methodb 会是非事务性的?

示例代码如下:

public class A {

  @Autowired
  B b;

  @Transactional
  public void methoda() {
    b.methodb();
  }
}



@Component
public class B {

  // this method is non transactional and is called from method A in class A
  public void methodb() {
    //do some db updates
  }
}
Run Code Online (Sandbox Code Playgroud)

Nat*_*hes 7

如果 B 中没有 @Transactional 注释来告诉它,则 b 方法将使用在调用 A.method 时建立的事务。这对于 Spring 来说是正常的,我们有标记为事务性的组件,它们调用参与当前事务的 DAO,而它们本身没有被标记为事务性的。

如果你确实想暂停当前事务,可以在b方法中添加这个注解:

@Transactional(propagation = Propagation.NOT_SUPPORTED)
Run Code Online (Sandbox Code Playgroud)

Spring API 文档中有一个关于暂停事务的警告:

注意:实际的事务暂停不会在所有事务管理器上开箱即用。这尤其适用于 JtaTransactionManager,它需要提供 javax.transaction.TransactionManager(在标准 Java EE 中是特定于服务器的)。