问题标签 [staleobjectstate]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
3064 浏览

hibernate - 如何检测与 Hibernate 的事务冲突?

我正在使用 Hibernate 2.6 和 hibernate-entitymanager。我试图捕捉和处理两个事务在一个对象上发生冲突的情况。这是发生的事情:

两个线程正在更新具有 @Version 字段的单个对象。失去提交竞争的线程在刷新时记录 StaleObjectStateException。异常不会被抛出,它只是被记录。我猜该事务当时被标记为仅回滚。

之后,当线程尝试执行提交时,它会因 RollbackException 而失败。我没有找到在代码中找出事务回滚的方法。

有没有办法在代码中捕捉和处理这种情况?基本上我想捕捉 StaleObjectStateException,但问题是 - 它没有被抛出。

更新:我试图从鸟瞰图完成的事情如下:

我有一个在 JBoss 下运行的 J2EE 应用程序。它有一些内部定时器调用服务和从 UI 调用的服务。它也有一个关键实体。我需要确保不同的线程不能同时更新该实体类的对象,因为这可能会导致数据不一致。这就是我实施乐观锁定的原因。

当出现乐观锁问题时,我一般会尝试处理这种情况。我想在非常高的级别捕获它并显示有效的用户消息(在我的情况下,最高级别是 RestEasy 的 ExceptionMapper)。问题是——当我捕捉到 RollbackException 时——已经太晚了。

我不手动冲洗。我的大多数 EJB 都使用 CMT,并且会话会自动刷新。

0 投票
4 回答
24554 浏览

design-patterns - 什么是陈旧状态?

我正在阅读维基百科(http://en.wikipedia.org/wiki/Object_pool)上的对象池模式,它提到了“危险的陈旧状态”。

究竟什么是“陈旧”状态?我知道状态是变量/数据,例如我的字段和属性,但陈旧或危险陈旧是什么意思?

0 投票
1 回答
502 浏览

asp.net-mvc - 在 asp.net mvc 应用程序中在哪里处理 StaleObjectStateException?

我正在使用每个请求模式的会话。交易是自动管理的。

如何轻松处理 StaleObjectStateException 并显示一些特定视图?

0 投票
2 回答
2161 浏览

java - Hibernate - 查询中的 StaleObjectStateException 可能吗?

StaleObjectStateException如果该查询的结果数据被第一个和第二个查询之间的不同会话中的并发更新更改,那么当您在一个 tx 中执行相同的查询两次时,是否可以通过 Hibernate 获得一个?

在这种情况下,我对所有实体使用乐观并发控制。

所以它看起来像这样。

线程 1:事务开始
线程 1:查询被执行并检索,即键 = 4711 的顺序
线程 2:与键 4711 相同的顺序在第二个线程中被检索、更改和提交
线程 1:查询再次执行并应返回使用键 = 4711 订购

我会StaleObjectStateException在第二个查询中获得 Thread-1 吗?

谢谢你的帮助!

托马斯

0 投票
4 回答
48338 浏览

java - StaleObjectstateException 行被更新或删除

我在使用休眠的基于 Spring 框架的 Web 应用程序的控制器中遇到此异常。我尝试了很多方法来解决这个问题,但无法解决。

在控制器的方法中,handleRequestInternal对数据库的调用主要是为了“读取”,除非它是提交操作。我一直在使用 Spring 的 Session 但移到了getHibernateTemplate(),问题仍然存在。

基本上,这是对数据库的第二次调用会引发此异常。那是:

1)getEquipmentsByNumber(number) {首先根据“数字”从数据库中获取设备,该设备具有属性列表,每个属性都有值列表。我遍历这些值(原始对象字符串)以读入变量)

2) getMaterialById(id){根据id获取材料}

我确实理解第二次调用很可能是使会话“刷新”,但我只是在“读取”对象,那么如果没有任何更改,为什么第二次调用会在 Equipment 属性上抛出过时的对象状态异常?

调用后我无法清除缓存,因为它会导致我传递给视图的对象出现 LazyExceptions。

我已阅读此内容: https ://forums.hibernate.org/viewtopic.php?f=1&t=996355&start=0 但根据提供的建议无法解决问题。

我该如何解决这个问题?任何想法和想法都会受到赞赏。

更新: 我刚刚测试的是,在getEquipmentsByNumber()从属性列表中读取变量后的函数中,我这样做:getHibernateTemplate().flush();现在异常在这一行,而不是调用获取材料(即getMaterialById(id))。

更新: 在显式调用刷新之前,我正在从会话缓存中删除对象,以便缓存中没有陈旧的对象。

好的,所以现在问题已经转移到我执行此操作后从 DB 获取的下一个问题。我想我必须将这些方法标记为同步并在我读完它们的内容后立即驱逐对象!听起来不太好。

更新: 使handleRequestInternal方法“同步”。错误消失了。当然,不是最好的解决方案,而是怎么做!尝试handleRequestInternal关闭当前会话并打开一个新会话。但这会导致应用程序的其他部分无法正常工作。尝试使用ThreadLocal也没有用。

0 投票
3 回答
2680 浏览

hibernate - 在grails中,为什么我在刷新后直接得到一个StaleObjectStateException?

我得到这样的代码:

尽管进行了获取和刷新,但执行保存时有时会收到“org.hibernate.StaleObjectStateException:行已被另一个事务更新或删除(或未保存的值映射不正确)”。

当我开始在多个会话中同时执行此方法时,就会发生这种情况。但是随后事务 1肯定完成了,再次为事务 2 执行此代码仍然失败!(我正在使用事务服务在事务由于乐观锁定而失败时重新执行事务,请参见此处)。

尽管我从数据库中获得了“新鲜”版本,但这怎么可能?

0 投票
3 回答
1182 浏览

nhibernate - How should NHibernate update properties mapped as Version

Using fluent NHibernate I have a property on a class mapped using Version

When I save the object, the Version property gets incremented in the database as I would expect, but the value of the property on the object only seems to change sometimes.

The problem is then that if it remains as 1 and I make more changes and save again I get a StaleObjectStateException.

What's weird is that sometimes it works fine and the item.Version value does get correctly incremented, but I can't figure out the difference between the cases where it does and the cases where it doesn't.

I've tried searching but can't seem to find any documentation on this. Can anyone explain what NHibernates expected behaviour is with the Version mapping?

[NHibernate version 2.1.2]

0 投票
1 回答
1472 浏览

hibernate - 在 Spring 声明式事务管理中处理 Hibernate 异常

我为我的 Spring+Hibernate+Struts 应用程序使用了 PROPAGATION_REQUIRED 声明式事务管理方法。我可以在进行服务调用的地方(事务开始的地方)捕获StaleObjectException(预期的)。在执行更新的服务方法中有嵌套调用 Foo1、Foo2、Foo3。我想在这些方法中捕获异常。我该怎么做?任何替代方案或解决方法?

0 投票
1 回答
2747 浏览

hibernate - 删除实体时避免 StaleObjectStateException

我有 2 个并发线程同时进入(Spring)事务服务。

使用 Hibernate,服务方法加载一些实体,处理这些实体,找到一个并将其从数据库中删除。伪代码如下:

如果两个线程同时传递相同的参数,则两者都将“找到”两个都将调用的相同实体deleteorg.hibernate.StaleObjectStateException当会话关闭时,其中一个将失败。

我希望两个线程都返回实体,而不会抛出异常。为了实现这一点,我尝试在删除实体之前锁定(使用“select ... for update”)实体,如下所示:

我使用load()而不是get()因为根据休眠 API,如果已经在会话中,get 将返回实体,而 load 应该重新读取它。

如果两个线程同时进入上述方法,其中一个线程阻塞了一个锁定阶段,当第一个线程关闭事务时,第二个线程被唤醒并抛出一个org.hibernate.StaleObjectStateException. 为什么?

为什么锁定的负载不只是返回null?我怎么能做到这一点?

0 投票
1 回答
1664 浏览

nhibernate - NHibernate StaleObjectStateException 之后如何优雅地合并对象图?

我们试图在抛出 StaleObjectStateException 后合并对象以保存合并的副本。

这是我们的环境状况:

  • 项目清单
  • 多用户系统
  • WPF 桌面应用程序、SQL Server 2008 数据库
  • NHibernate 3.1.0.4000,FluentNHibernate 1.2.0.712
  • 全球、长期运行的 NHibernate 会话 [暂时。我们知道每个演示者会话是推荐的模式,但目前在我们的项目计划中没有时间进行转换。]
  • 自上而下的保存和属性导航(也就是说我们在域图中保存了顶层对象(这里称为Parent))
  • .Cascade.AllDeleteOrphan() 在大多数情况下使用。
  • 用户独占域图中的某些对象,但共享父对象的所有权。
  • Children 对象的导航属性不存在。
  • 所有类都有数字 ID 和数字版本字段。

用例:

  • 用户 1 启动应用程序并打开父级。
  • 用户 2 启动应用程序并打开 Parent。
  • 用户 2 添加了一个孩子(此处为 C2)。
  • 用户 2 保存父级。
  • 用户 1 添加了一个孩子(此处为 C1)。
  • 用户 1 保存父级。
  • 用户 1 收到一个 StaleObjectStateException (这是正确的)

我们希望优雅地处理异常。因为用户共享父级的所有权,所以用户 1 应该能够成功保存,并且将父级与他的新孩子和用户 2 的孩子一起保存。

根据 Ayende ( http://msdn.microsoft.com/en-us/magazine/ee819139.aspx ) 的说法,当 SOSE 被抛出时:

您的会话及其加载的实体是烤面包,因为使用 NHibernate,从会话中抛出的异常会将会话移动到未定义的状态。您不能再使用该会话或任何加载的实体

C1 已经被现在不可用的会话分配了一个 ID 和版本号。(我希望没有。)

我们如何结合使用 ISession.Merge() 和 ISession.Refresh() 来获得一个新保存的同时具有 C1 和 C2 的 Parent ?

我们尝试了许多神秘的排列方式,但都没有完全奏效。通常,“行已被另一个事务更新或删除(或未保存的值映射不正确”或 ODBC 级别的实际 ID 冲突。

目前我们的理论:

  1. 重置 C1 上的版本号(以防止“未保存的值映射不正确”)
  2. 获取新会话
  3. 新会话。刷新(C1);
  4. newParent = newSession.QueryOver[...]
  5. newParent.Add(C1);
  6. newSession.SaveOrUpdate(newParent)

但是,所有文档都表明 newSession.Merge应该就足够了。

用作研究的其他帖子:
Fluent NHibernate Newbie:行已被另一个事务更新或删除
是否有替代 ISession.Merge() 的方法在使用乐观锁定时不会抛出?
StaleObjectstateException 行由
How I can tell NHibernate to save only changed properties
Hibernate (JPA): how to handle StaleObjectStateException when multiple object has been modified and commited 更新或删除(java,但相关,我认为)