![](/img/trans.png)
[英]Hibernate IS NOT throwing StaleObjectStateException (DO NOT DO OPTIMISTIC LOCKING)
[英]Grails: Optimistic locking, StaleObjectStateException with domain on session with Spring Security, updating counters
我有一个Grails应用程序,人们可以在其中通过Spring Security登录。 然后,在登录期间,将其用户域加载到会话上。
当另一个用户执行一个操作来更新数据库user.save(flush:true)
中当前在登录用户的另一个会话上的用户对象上的计数器时,出现user.save(flush:true)
例如,我在会话中具有用于登录用户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
那么我该如何解决呢?
解决:基本上在会话中没有用户域。 只是用户ID。 因此,您可以在需要使用域时加载它。
解决方案是不要在会话内部使用域对象。 改用id,然后为需要用户数据的每个请求加载对象。 它是针对grails的spring安全插件中引入的差异。 有关更多信息,请在此处查看(官方文档):
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.