【问题标题】:@Async and @Transaction aspect order@Async 和 @Transaction 方面顺序
【发布时间】:2019-02-13 05:18:55
【问题描述】:

使用 Spring Boot 2.1.1.RELEASE / Spring Framework 5.1.4,我有一个应用程序,通过以下方式启用了 @Async@Transactional 注释:

@EnableAsync(mode = AdviceMode.ASPECTJ)
@EnableTransactionManagement(mode = AdviceMode.ASPECTJ)

当运行一个同时注解的方法时,首先创建事务,然后开始异步执行。所以,实际的方法体并没有在事务内部执行。

    @Transactional
    @Async
    public void myAsyncMethod() {
        // asynchronous database stuff
    }

如何配置 spring / 方面以按照有意义的顺序实际执行,例如在新线程上开始事务?

附带说明,旧的 Spring Boot 1.5.17 / Spring Framework 4.3.20 确实有效。

演示:https://github.com/jaarts/spring-asynctransaction-demo

【问题讨论】:

  • 提示,@Enable 注释有一个order 属性。
  • Tnx,我试过了,但是没有效果。
  • 您正在使用 AspectJ 模式,因此您启用了加载或编译时编织。您是否尝试过简单地切换 @Transactional@Async 注释的顺序?显然,当使用 AspectJ 模式(而不是代理)时,它遵循类上声明的注释顺序(从编织 pov 我觉得这很合乎逻辑)。
  • 我确实在使用编译时编织。更改方法上的注释顺序也没有效果。我猜这与向编织者呈现方面的顺序有关。
  • 您是否将它们包含在编织所需的aop.xml 中?您应该能够控制那里的订单。尽管在查看 Spring 附带的 aop.xml 时,它们的顺序是异步然后事务。

标签: spring spring-transactions spring-aspects spring-async


【解决方案1】:

在 Spring 5 中,异步通知总是首先执行。请参阅 AsyncAnnotationBeanPostProcessor

public AsyncAnnotationBeanPostProcessor() {
    setBeforeExistingAdvisors(true);
}

在顾问应用代码执行时 postProcessAfterInitialization 中的超类之后

if (this.beforeExistingAdvisors) {
   advised.addAdvisor(0, this.advisor);
}

在@EnableTransactionManagement#order javadoc 上说

指示事务顾问的执行顺序

但在@EnableAsync

指明应用 AsyncAnnotationBeanPostProcessor 的顺序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-03
    • 2019-08-30
    • 2019-11-14
    • 2018-04-09
    • 2021-03-07
    • 2022-08-14
    • 2019-01-03
    • 2018-12-15
    相关资源
    最近更新 更多