Порядок аспектов @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

0 ответов

In Spring 5 Async advice is always execited first. See AsyncAnnotationBeanPostProcessor

public AsyncAnnotationBeanPostProcessor() {
    setBeforeExistingAdvisors(true);
}

After that on superclass in postProcessAfterInitialization when advisors aplies code executes

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

On @EnableTransactionManagement#order javadoc says

Indicate the ordering of the execution of the transaction advisor

but on @EnableAsync

Indicate the order in which the AsyncAnnotationBeanPostProcessor should be applied.

Другие вопросы по тегам