我有一个Grails应用程序,人们通过Spring Security登录。然后,他们的用户域将在登录期间加载到会话中。
当另一个用户预先生成更新数据库user.save(flush:true)
中当前位于登录用户的另一个会话上的用户对象的计数器的操作时,我得到StaleObjectStateException
E.g。我在登录用户A的会话中有“用户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)
我尝试过合并但没有运气。
我正在考虑完全取出“版本”属性,因为用户域上有如此多的更新,因为会有数百名用户登录。但我不知道这会对一致性产生什么影响。数据随着时间的推移。
是否会将user.save(flush:true)
换成User.executeUpdate(Update viewCount where ...)
来解决问题并带来更多缓存问题?
或者我可以在更新时选择可忽略“版本”的特定属性。 我真的不明白这个例子是怎么回事。 http://grails.1312388.n4.nabble.com/GORM-setting-access-field-td1592837.html
那我怎么解决这个问题呢?
答案 0 :(得分:1)
解决:基本上没有会话中的用户域。只是用户ID。因此,您可以在需要使用域时加载域。
解决方案是不在会话中使用域对象。请改为使用id,然后为每个需要用户数据的请求加载对象。它是在Spring的Spring安全插件中引入的差异。有关详细信息,请查看此处(官方文档):