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