Java @仅在一个方法上进行事务处理
我需要创建一个@Scheduled方法,它有一个模式列表,对于每个模式,从两个表中删除行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(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();