Grails: оптимистическая блокировка, StaleObjectStateException с доменом в сеансе с Spring Security, обновление счетчиков - PullRequest
1 голос
/ 07 ноября 2010

У меня есть приложение Grails, в которое люди входят через Spring Security.Затем их пользовательский домен загружается в сеанс на время входа в систему.

Я получаю исключение StaleObjectStateException, когда другой пользователь выполняет действие, обновляющее счетчик для объекта пользователя в базе данных user.save(flush:true), которая в данный момент включена.другой сеанс пользователя, вошедшего в систему

Например, у меня есть объект "Пользователь A" в сеансе для пользователя, вошедшего в систему А. Затем, когда пользователь B вошел в систему, он выполняет действие для обновления объекта пользователя A, новерсия не синхронизирована.

org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [com.example.User#2]

        at $Proxy12.merge(Unknown Source) 

Я попытался объединить, но не повезло.

Я думаю о том, чтобы полностью удалить свойство "version", так как обновлений так много.в пользовательском домене, поскольку в систему войдут сотни пользователей. Но я не знаю, как это повлияет на согласованность данных с течением времени.

Поменяет ли user.save(flush:true) на User.executeUpdate(Update viewCount where ...) решениепроблема и принести больше проблем с кэшированием?

Или я могу выбрать определенные свойства, которые могут игнорировать «версию» при их обновлении.Я не очень понимаю, что происходит с этим примером.http://grails.1312388.n4.nabble.com/GORM-setting-access-field-td1592837.html

Так, как я могу решить это?

1 Ответ

1 голос
/ 10 ноября 2010

Решено: в основном нет пользовательского домена в сеансе.Просто идентификаторы пользователей.Таким образом, вы можете загрузить домен, когда вам нужно его использовать.

Решение не заключается в использовании объекта домена внутри сеанса.Вместо этого используйте идентификатор, а затем загружайте объект для каждого запроса, который требует пользовательских данных.Это различия введены в весенний плагин безопасности для Grails.Для получения дополнительной информации посмотрите здесь (официальные документы):

http://burtbeckwith.github.com/grails-spring-security-core/docs/manual/guide/2%20Differences%20Between%20the%20Spring%20Security%20and%20Acegi%20Plugins.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...