【问题标题】:Grails: events.PatchedDefaultFlushEventListener - Could not synchronize database state with session org.hibernate.StaleObjectStateExceptionGrails:events.PatchedDefaultFlushEventListener - 无法将数据库状态与会话 org.hibernate.StaleObjectStateException 同步
【发布时间】:2014-08-21 14:22:44
【问题描述】:

我的应用程序出现以下错误。

ERROR events.PatchedDefaultFlushEventListener  - Could not synchronize database state with session
org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [buddyis.User#848df2e62fcf93e1b3]
    at buddyis.SessionResource$_login_closure1.doCall(SessionResource.groovy:104)
    at org.grails.datastore.gorm.GormStaticApi.withTransaction(GormStaticApi.groovy:814)
    at org.grails.datastore.gorm.GormStaticApi.withTransaction(GormStaticApi.groovy:714)
    at buddyis.SessionResource.login(SessionResource.groovy:41)
    at com.sun.jersey.spi.container.JavaMethodInvokerFactory$1.invoke(JavaMethodInvokerFactory.java:60)
    at com.sun.jersey.server.impl.model.method.dispatch.AbstractResourceMethodDispatchProvider$TypeOutInvoker._dispatch(AbstractResourceMethodDispatchProvider.java:185)
    at com.sun.jersey.server.impl.model.method.dispatch.ResourceJavaMethodDispatcher.dispatch(ResourceJavaMethodDispatcher.java:75)
    at com.sun.jersey.server.impl.uri.rules.HttpMethodRule.accept(HttpMethodRule.java:302)
    at com.sun.jersey.server.impl.uri.rules.ResourceClassRule.accept(ResourceClassRule.java:108)
    at com.sun.jersey.server.impl.uri.rules.RightHandPathRule.accept(RightHandPathRule.java:147)
    at com.sun.jersey.server.impl.uri.rules.RootResourceClassesRule.accept(RootResourceClassesRule.java:84)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1511)
    at com.sun.jersey.server.impl.application.WebApplicationImpl._handleRequest(WebApplicationImpl.java:1442)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1391)
    at com.sun.jersey.server.impl.application.WebApplicationImpl.handleRequest(WebApplicationImpl.java:1381)
    at com.sun.jersey.spi.container.servlet.WebComponent.service(WebComponent.java:416)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:538)
    at com.sun.jersey.spi.container.servlet.ServletContainer.service(ServletContainer.java:716)
    at org.grails.jaxrs.web.JaxrsContext$JaxrsServiceImpl.process(JaxrsContext.java:193)
    at org.grails.jaxrs.JaxrsController.handle(JaxrsController.groovy:45)
    at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:198)
    at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
    at org.grails.jaxrs.web.JaxrsFilter.doFilterInternal(JaxrsFilter.java:46)
    at com.github.greengerong.PreRenderSEOFilter.doFilter(PreRenderSEOFilter.java:65)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)

此错误是什么意思,我该如何预防?

【问题讨论】:

    标签: java hibernate spring-mvc grails groovy


    【解决方案1】:

    这个异常是由以下原因引起的

    • 安读一行
    • Bob 读取同一行
    • Bob 更新行
    • Ann 尝试更新该行,但尝试失败,因为 Hibernate 注意到它在 Ann 读取后已更新

    很难告诉你该怎么做,因为你没有提供任何上下文信息,例如谁或什么正在读取/更新该行。以下是一些一般性建议:

    如果您不关心这种情况,并且希望 Ann 能够更新该行,即使该行在她阅读后(由 Bob)更新了,只需通过将以下内容添加到相关的来禁用乐观锁定领域类

    static mapping = {
        version false
    }
    

    或者,您可以在控制器中检查该行在 Ann 读取后是否已更新,如果是,则向她显示更新的行,以便她可以将她的更新重新应用于最新数据。可以通过存储版本号来执行控制器中的检查。 (安读到)在一个隐藏的表单域中。当 Ann 的更新提交(带有隐藏版本号)时,从数据库中加载对象并检查提交的版本号。等于版本号。从数据库加载的对象。如果数字不同,则显示该行的最新版本以及一条消息,告知她发生了什么。

    当然,上述建议仅适用于用户提交表单正在更新行的情况。但正如我所说,您的问题不包含任何上下文,而且我的水晶球电量不足。

    【讨论】:

    • 如何查看版本是否有变化?我看到的唯一方法是再次从数据库加载实例并比较版本号。
    猜你喜欢
    • 2013-09-04
    • 2017-06-18
    • 1970-01-01
    • 2011-05-27
    • 2011-04-18
    • 1970-01-01
    • 2013-07-01
    • 2012-02-20
    相关资源
    最近更新 更多