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

时间:2015-01-10 15:54:12

标签: hibernate grails gorm

我在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
  }
}

我该如何康复?我不介意零星的失败(理想情况下我会收集这些并在最后再试一次),但现在这确实会停止所有剩余的更新。

1 个答案:

答案 0 :(得分:1)

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

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

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.
      }
    }
}