Почему в 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)
Другие вопросы по тегам