spring - @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,它确实有效。
解决方案
在 Spring 5 中,异步通知总是首先执行。请参阅 AsyncAnnotationBeanPostProcessor
public AsyncAnnotationBeanPostProcessor() {
setBeforeExistingAdvisors(true);
}
当顾问应用代码执行时,在 postProcessAfterInitialization 的超类上之后
if (this.beforeExistingAdvisors) {
advised.addAdvisor(0, this.advisor);
}
在@EnableTransactionManagement#order javadoc 上说
指示事务顾问的执行顺序
但是在@EnableAsync
指示应应用 AsyncAnnotationBeanPostProcessor 的顺序。
推荐阅读
- r - 使用 data.table `:=` 进行动态分配
- python - NameError - 如何修复?
- reactjs - 无法将 google 的 Material Web 组件 SASS 导入 React 项目
- sql - SQL 中引用表的给定键没有唯一约束匹配
- sql-server - 如何使用参数化 SQL 插入地理列
- debugging - 如何调试 App Script 中的 OnEdit 代码?
- ionic-framework - 带有 .p8 键的 iOS 推送通知在 Firebase 中不起作用
- c++ - 为什么在将 libcurl 与 CURLOPT_PROXY 一起使用时会出现 CURLE_NOT_BUILT_IN?
- javascript - 单击元素后Javascript不会隐藏文本
- c# - C#解析泛型类型参数