Почему в Grails я получаю исключение StaleObjectStateException сразу после обновления? - PullRequest
2 голосов
/ 08 декабря 2010

Я получил такой код:

def myObject = MyDomainClass.get(myId)
myObject.refresh()
myObject.myProperty = myValue
myObject.save(flush:true, failOnError:true)

Несмотря на получение и обновление, я иногда получаю "org.hibernate.StaleObjectStateException: строка была обновлена ​​или удалена другой транзакцией (или несохраненным значением)отображение было неправильным) ", когда выполняется сохранение.

Это происходит, когда я начинаю выполнять этот метод одновременно в нескольких сеансах.Но тогда транзакция 1 определенно завершена, этот код выполняется снова для транзакции 2, и он все еще завершается неудачно!(Я использую сервис транзакций для повторного выполнения транзакций, когда они терпят неудачу из-за оптимистической блокировки, см. здесь ).

Как это может быть, хотя я получаю «свежую» версию отБД?

Ответы [ 3 ]

1 голос
/ 08 декабря 2010

Я нашел хотя бы обходной путь - откат пустой транзакции:

myDomain.withTransaction { status -> 
  status.setRollbackOnly()
}
1 голос
/ 08 декабря 2010

Эта ветка форума намекает на то, что вам может понадобиться еще один сеанс Hibernate.Что если вы попробуете новый сеанс для новой транзакции, например

Book.withNewSession{}
0 голосов
/ 06 мая 2015

вы должны использовать

MyDomainClass.lock(myId)

вместо

MyDomainClass.get(myId)
...