在列表中选择一个域对象StaleObjectStateException影响所有剩余的更新(Stal

2019-10-21 13:40发布

我在我的迭代用户的Grails一个石英工作,做一个每晚更新上每个用户。 但是,如果我得到一个用户对象的更新一个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
  }
}

我怎样才能恢复? 我不介意零星故障(最好我收集这些,并在年底重试),但现在这个从字面上停止所有剩余的更新。

Answer 1:

理想情况下,你应该做的每一次更新/保存在一个新的事务,否则任何故障,将影响整个事务/ Hibernate的Session。 这会更有意义,因为每一次更新/保存应该是它自己的原子操作呢。

你也应该得到事务中每个域对象。

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


文章来源: StaleObjectStateException on one domain object in a list affects all remaining updates