Почему в Grails я получаю исключение StaleObjectStateException сразу после обновления?
Я получил такой код:
def myObject = MyDomainClass.get(myId)
myObject.refresh()
myObject.myProperty = myValue
myObject.save(flush:true, failOnError:true)
Несмотря на получение и обновление, я иногда получаю "org.hibernate.StaleObjectStateException: строка была обновлена или удалена другой транзакцией (или отображение несохраненного значения было неправильным)", когда выполняется сохранение.
Это происходит, когда я начинаю выполнять этот метод одновременно в нескольких сеансах. Но затем транзакция 1 определенно завершается, этот код выполняется снова для транзакции 2, и он все еще не выполняется! (Я использую сервис транзакций для повторного выполнения транзакций, когда они терпят неудачу из-за оптимистической блокировки, см. Здесь).
Как это может быть, хотя я получаю "свежую" версию из БД?
3 ответа
Я, по крайней мере, нашел обходной путь - откат пустой транзакции:
myDomain.withTransaction { status ->
status.setRollbackOnly()
}
Эта ветка форума намекает на то, что вам может понадобиться еще один сеанс Hibernate. Что если вы попробуете новый сеанс для новой транзакции, например
Book.withNewSession{}
Ты должен использовать
MyDomainClass.lock(myId)
вместо
MyDomainClass.get(myId)