【发布时间】:2020-04-21 17:15:50
【问题描述】:
我正在 Spring Boot 中编写一个多线程 cron 作业。我有一个需要对其执行某些操作的用户列表。下面是来自 cron 作业的 sn-p
public void executeCronJob() {
LOG.debug("Started >>>");
User user = userService.findFirstNotInProgress();
if (user == null) {
LOG.debug("<<< User not found");
return;
}
userService.updateStatus(user, Status.IN_PROGRESS);
someOtherService.doSomeActionRelatedToUser(user);
userService.updateStatus(user, Status.COMPLETED);
LOG.debug("<<< Completed");
}
在 UserService.java
private void updateStatus(User user, Status status) {
user.setStatus(status);
userRepository.save(user);
}
我正在使用多线程,因为someOtherService.doSomeActionRelatedToUser(user); 方法可能需要相当长的时间,因此会阻止其他用户的执行。第一次调用userService.updateStatus 工作正常,用户进入 IN_PROGRESS 状态。但是在对与用户相关的someOtherService 执行操作后,当我再次调用userService.updateStatus 将状态设置为COMPLETED时,我收到错误
行被另一个事务更新或删除(或未保存值映射不正确)
我尝试在 UserService 中使用 userRepository.saveAndFlush(user);,但它仍然给我同样的错误。我该如何解决这个问题?
【问题讨论】:
-
看起来不止一个线程试图更新同一个实体,一个线程成功,当下一个线程去提交数据时,它看到它已经被修改并最终抛出错误。
标签: java multithreading spring-boot cron transactions