【问题标题】:No existing transaction found for 'mandatory' after calling @Sheduled Method调用 @Sheduled 方法后未找到“强制”的现有事务
【发布时间】: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


    【解决方案1】:

    问题是 MyObject import(Client client) 方法没有 public 修饰符,这就是为什么即使存在 @Transactional 注释也没有创建事务(我的错,对不起)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多