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

When calling a spring Non-Transactional method from a Transactional Method in another instance, does the transaction get propagated?

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

如果我们在另一个没有@Transactional 注释的实例中从一个有@Transactional 注释的方法中调用一个方法,会发生什么情况?来自 @Transactaional 注释方法的事务会被暂停吗?还是会被传播?

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

如下例所示,如果从 class A 中的 methoda() 调用 class 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
}

}

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

如果确实要暂停当前事务,可以在b方法中加上this annotation

@Transactional(propagation = Propagation.NOT_SUPPORTED)

SpringAPI 文档中有关于暂停交易的警告:

NOTE: Actual transaction suspension will not work out-of-the-box on all transaction managers. This in particular applies to JtaTransactionManager, which requires the javax.transaction.TransactionManager to be made available to it (which is server-specific in standard Java EE).