Java @仅在一个方法上进行事务处理

Java @仅在一个方法上进行事务处理,java,spring,spring-boot,transactions,spring-transactions,Java,Spring,Spring Boot,Transactions,Spring Transactions,我需要创建一个@Scheduled方法,它有一个模式列表,对于每个模式,从两个表中删除行 @Scheduled(fixedDelay = 10000) public void scheduleFixedDelayTask() { List<String> presentSchemas = getPresentSchemas(); for (String schema : presentSchemas) { deleteFromCustomerT

我需要创建一个@Scheduled方法,它有一个模式列表,对于每个模式,从两个表中删除行

    @Scheduled(fixedDelay = 10000)
public void scheduleFixedDelayTask() {
    List<String> presentSchemas = getPresentSchemas();
    for (String schema : presentSchemas) {
        deleteFromCustomerTables(schema);
    }
}
但我仍然收到TransactionRequiredException。 您有解决方案吗?

  • 您必须确保事务管理器的配置如下:
@配置
@启用事务管理
公共类TransactionConfig{
@豆子
@初级的
公共平台transactionManager transactionManager(){
返回新的JpaTransactionManager();
}
}
  • 您必须确保deleteFromCustomerTables方法不在同一组件中,如下所示:
@组件
类组件1{
无效scheduleFixedDelayTask(){…}
}
@组成部分
类组件2{
void deleteFromCustomerTables(){…}
}
但在非常高的层次上,Spring为 在类本身或成员上声明@Transactional。代理是 大部分在运行时是不可见的。它为Spring提供了一种注入方式 方法调用对象之前、之后或周围的行为 代理。事务管理只是这些行为的一个例子 那是可以钩住的。安全检查是另一个问题。你可以 为日志记录之类的事情也提供您自己的。所以当你注释一个 方法,Spring动态创建一个 实现与要注释的类相同的接口。及 当客户端对您的对象进行调用时,这些调用会被拦截 以及通过代理机制注入的行为


如果您不想回滚所有更改,那么您可以将事务性代码放在try-catch块中,出现错误的代码将失败,循环将尝试其他代码,直到列表结束。即使我将scheduleFixedDelayTask定义为@transactional并将try-catch放在deleteFromCustomerTables(架构)周围,它仍然会返回错误“事务自动回滚,因为它已标记为仅回滚”非常感谢!我的问题是使用了相同的组件!创建第二个组件解决了问题。
    Session session = entityManager.unwrap(Session.class);
    Transaction t = session.beginTransaction();
    //exec delete
    t.commit();
    session.close();