【问题标题】:Hibernate Optimistic Locking ExceptionHibernate 乐观锁定异常
【发布时间】:2016-07-18 03:45:58
【问题描述】:

我的 WebApp 出现以下错误:

Handling an unexpected exception in webApp: - javax.servlet.error.status_code = 500 - javax.servlet.error.exception_type = class org.springframework.orm.hibernate3.HibernateOptimisticLockingFailureException - javax.servlet.error.message = Object of class [domain.entity.common.dataEntity] with identifier [110837262]: optimistic locking failed; nested exception is org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect): [domain.entity.common.dataEntity

我不知道为什么会出现这个错误,它出现在下面一行。

SpecEntity specTemp = this.persistService.merge(specTemp);

有人可以在这里帮忙吗..

【问题讨论】:

    标签: hibernate spring-mvc jpa jakarta-ee


    【解决方案1】:

    在这种情况下,HibernateOptimisticLockingFailureException 异常发生在您尝试在同时已被另一个事务更新的 entity (specTaskTemp) 上调用 merge 时。

    如果您查看 SpecEntity 类,您一定已经定义了 @Version 列。 hibernate 将使用它来检查您要合并的实体是否比数据库中的实体旧。

    示例流程:

    1. 事务 T1 加载 SpecEntity 实体,其版本列值为
    2. 事务 T2 加载相同的 SpecEntity,版本值为 1。
    3. T2 对该实体进行了一些更改并更新了数据库,因此版本值变为 2。
    4. 随后 T1 尝试更新实体。
    5. Hibernate 检查实体中的版本(即 1)是否与数据库中的值的版本(更新为 2)相同。
    6. 当它发现不匹配时,它会抛出 HibernateOptimisticLockingFailureException

    根据您的用例,您可以从数据库中重新加载更新后的entity,并向用户显示updated data,以便用户决定下一步做什么。

    或者如果您想继续用specTaskTemp实体中的数据覆盖数据库中的数据,您可以从数据库中获取该实体的最新版本,将其版本值复制到specTaskTemp实体然后调用merge 电话。

    【讨论】:

    • 谢谢或回复.. 我想知道类似.. 为什么它会在 GenDataEntity 上引发错误,因为 GenDataEntity 扩展 SpecEntity .. 如果在 SpecEntity 的同一会话中合并或持续存在,是否会发生这种情况.. 我们可以通过数据库中的 ID-110837262 跟踪过时的对象吗..
    • @Teena 不确定我是否可以在不查看您的域模型和应用程序流程的情况下回答这个问题。现在,由于您知道问题的症结以及何时可能发生此异常,您可以启用 show_SQL 属性并查看导致问题的确切事件序列。
    猜你喜欢
    • 2015-05-14
    • 2018-10-22
    • 2014-02-18
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    • 2015-04-28
    • 2016-11-20
    • 2013-09-16
    相关资源
    最近更新 更多