Grails:乐观锁定,StaleObjectStateException与Spring Security会话,更新计数器

时间:2010-11-07 11:41:35

标签: hibernate session grails locking spring-security

我有一个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

那我怎么解决这个问题呢?

1 个答案:

答案 0 :(得分:1)

解决:基本上没有会话中的用户域。只是用户ID。因此,您可以在需要使用域时加载域。

解决方案是不在会话中使用域对象。请改为使用id,然后为每个需要用户数据的请求加载对象。它是在Spring的Spring安全插件中引入的差异。有关详细信息,请查看此处(官方文档):

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