@Async和@Transaction方面的顺序

时间:2019-02-13 05:18:56

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

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

1 个答案:

答案 0 :(得分:1)

在Spring 5中,总是始终执行异步建议。请参阅AsyncAnnotationBeanPostProcessor

--fixed part
SELECT DISTINCT      
c.fk_product AS com, 
c.value AS qty 

--begin your editable part
FROM
(
  SELECT fk_product,
  SUM(value) AS value
  FROM llx_stock_mouvement
  WHERE type_mouvement = 2 AND label LIKE 'SH%'
  GROUP BY fk_product
) c
--end your editable part

--fixed part
ORDER BY    1
DESC
LIMIT 26

之后,当顾问程序执行代码时,在postProcessAfterInitialization中的超类上执行

public AsyncAnnotationBeanPostProcessor() {
    setBeforeExistingAdvisors(true);
}

关于@ EnableTransactionManagement#order javadoc说

  

指示交易顾问的执行顺序

但在@EnableAsync上

  

指示应应用AsyncAnnotationBeanPostProcessor的顺序。