【发布时间】:2019-09-25 14:20:04
【问题描述】:
我有两种方法:
@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。因此,所有逻辑都在一个事务中执行。当我在没有注释@Sheduled 的情况下调用 myMethod() 时,一切正常。
但是当它被@Sheduled注解调用时,它就会陷入异常
org.springframework.transaction.IllegalTransactionStateException: No existing transaction found for transaction marked with propagation 'mandatory'
它在成功打印“测试”后尝试在import 方法中调用clientManager.findClient(client); 后下降,这意味着(我认为)事务是在myMethod 中创建的。
我试图删除myMethod 上的@Transactional 并将其设置为import 方法,因此,预计会在import 中创建事务并通过强制传播调用findClient(client),但它会导致相同的异常。
请帮忙。我需要这种被规避的行为。
【问题讨论】:
标签: java spring transactions