首页 > 解决方案 > @Async 和 @Transaction 方面顺序

问题描述

使用 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

标签: springspring-transactionsspring-aspectsspring-async

解决方案


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

public AsyncAnnotationBeanPostProcessor() {
    setBeforeExistingAdvisors(true);
}

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

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

在@EnableTransactionManagement#order javadoc 上说

指示事务顾问的执行顺序

但是在@EnableAsync

指示应应用 AsyncAnnotationBeanPostProcessor 的顺序。


推荐阅读