列表中一个域对象的 StaleObjectStateException 影响所有剩余的更新

StaleObjectStateException on one domain object in a list affects all remaining updates

我在 Grails 中有一个 Quartz 作业,它迭代我的用户并对每个用户进行每晚更新。但是,如果我在更新用户对象时收到 StaleObjectStateException,似乎之后的每次更新都会收到相同的 StaleObjectStateException。像这样:

def users = User.list()
users.each { user ->
  try {
    user.doUpdate()
    user.save()
  } catch (all) {
    // I end up here for every user object after a StaleObjectStateException
  }
}

我该如何恢复?我不介意零星的失败(理想情况下我收集这些并在最后重试),但现在这实际上停止了所有剩余的更新。

理想情况下,您应该在新事务中执行每个 update/save,否则任何失败都会影响整个事务/休眠会话。这更有意义,因为每个 update/save 无论如何都应该是它自己的原子操作。

您还应该获取事务中的每个域对象。

def userIds = User.withCriteria {
  projections {
    property("id")
  }
}
userIds.each { userId ->
    User.withTransaction {
      try {
        def user = User.get(userId)
        user.doUpdate()
        user.save()
      } catch (all) {
        // do whatever.
      }
    }
}