【发布时间】:2021-04-15 10:01:25
【问题描述】:
我需要创建一个 @Scheduled 方法,它有一个模式列表,并且对于每个模式,从 2 个表中删除行。
@Scheduled(fixedDelay = 10000)
public void scheduleFixedDelayTask() {
List<String> presentSchemas = getPresentSchemas();
for (String schema : presentSchemas) {
deleteFromCustomerTables(schema);
}
}
我已将 deleteFromCustomerTables 定义为 @Transactional(propagation = Propagation.REQUIRES_NEW) 并在其中使用 EntityManager 从 2 个表中删除行。
为了使其工作,我需要将@Transactional 添加到 scheduleFixedDelayTask,否则我会收到 TransactionRequiredException。
我的问题是我不希望整个调度程序都成为@Transactional,如果一个模式出现问题,我不想回滚所有模式。
我也尝试过不使用 @Transactional 和使用 :
Session session = entityManager.unwrap(Session.class);
Transaction t = session.beginTransaction();
//exec delete
t.commit();
session.close();
但我仍然收到 TransactionRequiredException。 你有解决办法吗?
【问题讨论】:
-
如果您不想回滚所有更改,那么您可以将事务代码放在 try-catch 块中,出错的代码将失败,循环将尝试其他代码,直到列表结束。
-
即使我将 scheduleFixedDelayTask 定义为 @Transactional 并将 try-catch 放在 deleteFromCustomerTables(schema) 周围,它仍然会回滚并出现错误“事务静默回滚,因为它已被标记为仅回滚”
标签: java spring spring-boot transactions spring-transactions