使用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中,它确实可以工作。
答案 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的顺序。