У меня есть 2 метода:
@Scheduled(cron = "0 * * * * *")
@Transactional
public void myMethod() {
//omited logic without calling repositories or different methods
helper.import(new Client());
}
и
@Transactional
public void myMethod() {
//omited logic without calling repositories or different methods
helper.import(new Client());
}
Один по расписанию, другой нет.Они вызывают этот метод в другом компоненте с автоматическим подключением:
@Transactional(propagation = Propagation.MANDATORY)
MyObject import(Client client) {
System.out.println("test");
clientManager.findClient(client);
//omited logic
}
Метод findClient(Client client)
в другом компоненте с автоматическим подключением:
@Transactional(propagation = Propagation.MANDATORY)
public Client findClient(Client client) {
//omited logic
}
Ожидаемое поведение: транзакция создана в myMethod
, затем вызывается import
с обязательной транзакцией распространения и последующим вызовом findClient
с тем же распространением.Итак, вся логика выполнена в одной транзакции.И когда я вызываю myMethod () без аннотации @Sheduled, все работает нормально.
Но когда он вызывает аннотацией @Sheduled, он попадает в исключение org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory'
Он падает после попытки вызова clientManager.findClient(client);
в import
методепосле успешной печати «test», что означает (я думаю) транзакция была создана в myMethod
.
Я попытался удалить @Transactional для myMethod
и установить для него метод import
, поэтому ожидается создание транзакции в import
и вызов findClient(client)
с обязательным распространением, но это приводит к тому же исключению.
Пожалуйста, помогите.Мне нужно это запланированное поведение.