spring 删除循环中异步方法中的实体

j2qf4p5b  于 2023-02-28  发布在  Spring
关注(0)|答案(2)|浏览(265)

我使用Hibernate删除用户活动实体,但收到以下错误:* 用户活动461发生错误。数据访问异常:不存在ID为461的类com.db.model.UserActivity实体!* 我从调度程序调用此异步方法。我知道如果deleteById不返回实体,则会抛出EmptyResultDataAccessException。但我不知道它为什么要尝试删除一个不存在的实体。请解释。

@Async
@Override
@Transactional
public void deleteUserActivities(@NonNull LocalDateTime createdBefore) {
    for (Long uaId : userActivityRepository.findCreatedBefore(createdBefore)) {
        try {
            userActivityRepository.deleteById(uaId);
        } catch (Exception e) {
            log.error("Error for user activity {}", uaId, e);
        }
    }
}
8yparm6h

8yparm6h1#

当两个线程同时调用这个方法时,两个线程都可以得到相同的ID集,并且通过for循环,它们试图删除相同的实体,如果第一个线程先做,那么第二个线程失败。
如果调度程序在上一个调用结束之前调用此方法,则可能会发生这种情况

nqwrtyyt

nqwrtyyt2#

但是我不知道为什么它要删除一个不存在的实体。请解释一下。
this 3.0.2之后的版本已经修复了这个问题。如果没有要删除的实体,现在不会抛出异常。

相关问题