【问题标题】:Can @Transactional method call another @Transactional method without suspending?@Transactional 方法可以在不暂停的情况下调用另一个@Transactional 方法吗?
【发布时间】:2022-01-23 12:34:17
【问题描述】:

我在不同的类中有方法 A 和方法 B。两者都用@Transactional 注释。方法 A 正在调用 B。是否有任何解决方案可以在不同的事务中调用 B 但不暂停 A 事务? B 上的 Propagation.REQUIRES_NEW 提供了在被调用但挂起调用者事务时始终创建新事务的可能性

【问题讨论】:

    标签: spring spring-aop spring-annotations


    【解决方案1】:

    事务传播行为Propagation.NESTED 支持要求。

    请阅读 Spring 官方文档:Understanding PROPAGATION_NESTED

    PROPAGATION_NESTED 使用单个物理事务和多个 它可以回滚到的保存点。这种部分回滚让 内部事务范围触发其范围的回滚,其中 外部交易能够继续物理交易 尽管一些操作已被回滚。

    也可以在answer 中阅读有关 Spring 事务中嵌套传播的更多详细信息。

    【讨论】:

      【解决方案2】:

      据我所知,您无法使用注释 REQUIRED_NEW 来做到这一点。

      但是 spring 也支持手动使用 TransactionTemplate、TransactionDefinition 进行事务。

      我们可以通过一个 PlatformTransactionManager 使用多个定义。

      https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/support/TransactionTemplate.html

      https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/TransactionDefinition.html

      https://www.baeldung.com/spring-programmatic-transaction-management#4-custom-transaction-configurations

      【讨论】:

      • 我认为问题可能正在逼近。而不是试图找到如何在不同事务中调用方法而不暂停调用者事务我需要从调用者事务中取出方法调用
      • 是的,简化代码是最好的方法,我只想回答“我们可以在不暂停函数A的事务的情况下调用函数B吗……”,有可能……但是相当复杂,然后是必要的跨度>
      猜你喜欢
      • 2011-09-07
      • 2018-02-23
      • 2021-11-27
      • 1970-01-01
      • 2012-07-01
      • 1970-01-01
      • 2011-07-03
      • 2019-04-24
      • 1970-01-01
      相关资源
      最近更新 更多