问题标签 [optimistic-locking]

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 投票
0 回答
1004 浏览

.net - Fluent Nhibernate Optimistick 锁定不起作用

在我的应用程序中,我已将应用程序设置为使用策略来防止 2 个不同的对话处理相同的数据。但是不起作用,我不知道为什么。

问题:

配置:

我的应用程序中有 Fluent Nhibernate 配置:

例如,当我保存继承此属性的 CustomerOrder 实例时:

在映射中有:

最好的问候,铁托

0 投票
1 回答
750 浏览

java - 如何防止 Query.list() 上的 StaleObjectStateException?

我在我的软件中使用 Hibernate 乐观锁(通过 @Version 注释)。它工作得很好,但有时我在尝试仅从数据库中检索一些对象时得到 StaleObjectStateException。如何防止 Hibernate 抛出这些异常?

0 投票
1 回答
683 浏览

c++ - C++中原子的乐观锁定策略和排序

在阅读了 c++0x 的 atomics 并结合非锁定队列后,我决定尝试使用它们。

这个想法是编写一个带有乐观锁定的单个生产者、多个消费者队列。消息不需要被消费。跳过是完全可以的,只要消费者阅读它阅读最后一个版本或知道它的阅读是坏的。

在下面的代码中,我想到的策略失败了。数据被损坏,因为数据被乱序写入。任何有关为什么会这样以及如何解决它的指示将不胜感激。

Linux上编译:g++ -std=c++0x -o code code.cpp -lpthread

谢谢,丹尼斯

0 投票
1 回答
567 浏览

java - 在层次结构的中间类中使用 Hibernate 版本控制

我想在我的应用程序中使用 Hibernate 版本控制,但我在这样的类层次结构中遇到问题:C 扩展 B 和 B 扩展 A。我想在 B 类中使用版本,我不需要在 A 类中使用版本和我知道当我在 B 类中自动使用版本控制时,它将在 C 类中有效。我在休眠中使用“joined-subclass”实现继承,并且没有为“joined-subclass”定义“版本”标签。如何在我的类层次结构中使用版本控制?

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,但相关,我认为)

0 投票
2 回答
6525 浏览

mongodb - MongoDB 文档操作是原子的和隔离的,但它们是否一致?

我正在将我的应用程序从 App Engine 数据存储区移植到 MongoDB 后端,并且对“文档更新”的一致性有疑问。我知道一个文档上的更新都是原子的和孤立的,但是有没有办法保证它们在不同的副本集之间是“一致的”?

在我们的应用程序中,许多用户可以(并且将会)尝试通过在一次更新期间向其中插入一些嵌入式文档(对象)来同时更新一个文档。我们需要确保这些更新在所有副本中以逻辑一致的方式发生,即当一个用户将一些嵌入文档“放入”父文档中时,其他用户不能将他们的嵌入文档放入父文档中,直到我们确保他们已经阅读并收到第一个用户的更新。

所以我所说的一致性是我们需要一种方法来确保如果两个用户试图同时对一个文档执行更新, MongoDB只允许其中一个更新通过,而丢弃另一个(或至少防止两者发生)。我们不能在这里使用标准的“分片”解决方案,因为单个更新不仅仅包含增量或减量。

保证一个特定文档一致性的最佳方式是什么?

0 投票
1 回答
821 浏览

java - JPA:设置 @JoinColumn(updatable = false) 以避免 OptimisticLockException

给定以下两个实体

两个问题:

  1. 每次实体 B 合并到数据库时,实体 A 的版本号是否会增加(请注意,在与 A 的关系上没有定义 CascadeType.MERGE),因此,当 A 与不同的合并时,可能会导致 OptimisticcLockException版本号?

  2. 如果是,如果我添加关系,是否有助于避免出现 OptimisticLockException 的可能性@JoinColumn(updatable=false)

我的情况是实体 B 非常频繁地更新并且 A 偶尔更新,但只有它的基本属性(而不是关系)并且我在实体 A 上得到一个 OptimisticLockException。

0 投票
1 回答
630 浏览

grails - Grails 性能测试错误:org.hibernate.StaleObjectStateException:行已被另一个事务更新或删除

我正在准备性能测试并创建新的测试用例。所以我只是在测试一个测试用例,在我只能访问的服务器上运行它,我刚刚得到:org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction

我要测试的应用程序是后端。没有视图,没有会话,它类似于 REST [每个请求都包含执行任务所需的一切]。我一遍又一遍地为单个用户测试单个 API。请求来了,服务正常工作,响应被发回,我分析响应并向同一个用户的同一个 API 发送另一个请求。

正如我所提到的 - 对象不存储在会话中。每次请求到来时,我都在做 User.get(id from params)。

目前我在 Postgres 8.4.4 上运行这个应用程序。服务器非常强大,目前根本没有负载。

在我看来,我能够接收来自应用程序的响应 [服务器是远程的],对其进行分析并在保存事务之前发送另一个请求。这很奇怪。

我在这里有什么遗漏吗?我该怎么办?

0 投票
1 回答
1125 浏览

hibernate - 什么时候不在 Grails 域类中使用版本号?

在我之前的 Grails 项目(高交易量)中,我对具有 1 对多和多对多关系的 Stale Object Exceptions 有过可怕的经历。

我基本上保留了 Facebook 朋友的个人资料(学校、雇主的整个个人资料),而且大多数时候我一起保存了 1000 个用户个人资料。我通过从 School 和 Employer 域类中删除版本号解决了大部分问题,因为该数据大部分是固定的,并且无需为每次保存经验或教育而增加版本。由于时间紧迫,我不得不让事情顺利进行,并且我从整个用户对象层次结构中删除了版本号,因为我仍然习惯于获得一些过时的对象异常。

那么,当不在域类中使用版本时,我仍然一无所知?

0 投票
2 回答
1303 浏览

ravendb - RavenDB 在配置中使用OptimisticConcurrency?

有没有办法在 Raven.Server.exe.config 中将乐观并发设置为 true?或者,它可以以某种方式应用于数据库级别吗?在 RavenDB 的网站上,我看到一些提到设置 UseOptimisticConcurrency = true,但它看起来像是在代码中的会话级别:

我想知道该设置是否存在于服务器范围内的某个地方,因此不需要为代码中的每个会话指定它。

编辑:上面的代码产生以下错误。试图找出原因...

在此处输入图像描述

编辑2:好的,我正在取得进展。如果我检索对象,并在同一个会话中调用 GetEtagFor() ,那么我会得到一个有效的 eTag。所以我想我现在的主要问题是:在客户端 UI 中使用会话的正确方法是在应用程序启动时打开会话一次,然后在最后关闭它?并且... 存储 eTag 的正确方法是什么?按照上面的编码方式,在存储之前就检索了 eTag,我想这是错误的做法。我猜应该在第一次检索对象时检索 eTag。但是当我们最初得到一个对象列表时,我们是否必须遍历每个对象并在它们上调用 GetEtagFor() ?好像不太对...