hibernate - Grails:乐观锁定,StaleObjectStateException与Spring Security session 中的域,更新计数器

标签 hibernate session grails locking spring-security

我有一个Grails应用程序,人们可以在其中通过Spring Security登录。然后,在登录期间,将其用户域加载到 session 上。

当另一个用户执行一个操作来更新数据库user.save(flush:true)中当前在已登录用户的另一个 session 上的用户对象上的计数器时,出现StaleObjectStateStateException

例如。我在用于登录用户A的 session 中具有“用户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

那么我该如何解决呢?

最佳答案

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

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

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

关于hibernate - Grails:乐观锁定,StaleObjectStateException与Spring Security session 中的域,更新计数器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4117528/

相关文章:

java - 如何在 Hibernate 中记录数据库事务的开始和完成

python - Google 应用引擎中的 Webapp2 session

javascript - 如何使用 jquery 和 PHP session 变量

java - 如果 session 过期,如何重定向到登录页面?

grails - grails查询不同的条目

node.js - 由 : org. gradle.api.InvalidUserDataException 引起:无法添加任务 ':client:test',因为同名任务已存在

java - 在 JPA 中使用数组进行 native 查询

java - 如何公开和@EmbeddedId 的字段

java - 获取加入 Hibernate 中的关联

grails - 在Grails中使用CXF指定宽松的SOAP解析