Используя 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
@Enable
имеют атрибутorder
. - person M. Deinum   schedule 13.02.2019@Transactional
и@Async
? По-видимому, при использовании режима AspectJ (вместо прокси-серверов) он следует порядку аннотаций, объявленному в классе (что из переплетения pov я нахожу вполне логичным). - person M. Deinum   schedule 13.02.2019aop.xml
необходимое для плетения? Вы должны иметь возможность контролировать порядок там. Хотя они находятся в порядке асинхронности, а затем транзакции, если смотреть наaop.xml
, поставляемый с Spring. - person M. Deinum   schedule 13.02.2019aop.xml
. Насколько я понимаю, этот файл предназначен только для плетения во время загрузки. - person Jasper Aarts   schedule 14.02.2019aop.xml
, но этот порядок является асинхронным до tx. - person M. Deinum   schedule 14.02.2019