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

标签 java spring spring-jdbc spring-transactions

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

如果我们在另一个没有@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
}

}

最佳答案

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

如果确实要暂停当前交易,可以加上this annotation到 b 方法:

@Transactional(propagation = Propagation.NOT_SUPPORTED)

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

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).

关于java - 在另一个实例中从事务性方法调用 spring 非事务性方法时,事务是否得到传播?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64877922/

相关文章:

java - spring jdbc 中的可滚动结果集

java - 使用 Java 运行 PL/SQL block

java - 贝塞尔低通算法

java - 我应该部署在 GAE 还是 AWS 上?

java - RSQL : How to query for null column values?

java - 对使用 getBean ("myService"的依赖项的类进行单元测试

java - JSON 文件中的 Jackson 日期反序列化错误

java - Kubernetes 中的分布式 CRON

java - Spring Security 针对本地 Linux 帐户进行身份验证

spring-boot - HikariCP 中的 initializationFailTimeout 属性