列表中一个域对象的 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.
}
}
}
我在 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.
}
}
}