问题标签 [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 投票
1 回答
825 浏览

java - 忽略乐观锁定

我有包含 @version 字段的实体。有时我需要更新它,尽管有乐观锁定异常。

在那种情况下我可以以某种方式关闭它吗?或者我应该重新加载实体并重试保存它 n 次,直到它更新?

0 投票
1 回答
1365 浏览

jpa - JPA - @Version - 读取时增加

我已经实现了一个带有 @version 注释的简单实体 ejb。我希望每次更新实体后版本号都会增加。

但这似乎没有按预期工作。此外,每次我读取实体时,版本号都会自动增加(!?)。我希望版本只在提交后增加?

谁能解释为什么我的版本在阅读时也会增加?

0 投票
0 回答
394 浏览

optimistic-locking - 如何使用 JPA 注释获得乐观并发

我正在使用 JPA 3,带有注释(无映射文件)和提供者 org.hibernate.ejb.HibernatePersistence

我需要有乐观的并发性。

1)我试图依赖名为的标签,它没有工作。

2)所以我决定用java代码来做。我有一个 mergeServiceRequest 方法和一个 Request 类型的对象,如下所示:我启动一个事务,锁定请求对象,然后尝试从数据库中获取一个 Request 对象 newRequest,将其时间戳与当前一个请求进行比较。如果它们不匹配,我会抛出异常;如果它们匹配,那么我enter code here用当前时间更新当前请求并将其保存到数据库中。

我需要手动锁定对象,因为通过从会话启动事务,它不会锁定数据库中的行。我写了一些java代码,显示事务不会自动锁定数据库中的记录。

这种方法的问题是查询

总是返回与请求相同的对象。“请求”在会话 entityManger 中,查询总是返回会话中缓存的内容。我尝试了所有五个 query.setHint 行,我仍然得到相同的结果:没有执行数据库查询,结果直接来自会话缓存。

3)所以我也尝试使用另一个会话获取查询newRequest,如果我这样做,newRequest 将与请求不同。但是由于某种原因,如果我这样做了,那么即使在事务提交之后,请求对象上的锁定也不会被释放。代码如下所示

有人可以帮我吗?

谢谢。

丹尼尔

0 投票
1 回答
495 浏览

java - Web 应用程序中的乐观锁定

我们正在为我们的多租户应用程序构建客户配置工具。多个用户可以使用相同的配置,因此我们希望避免冲突。我们知道乐观锁定是要走的路。但是想知道如何向执行冲突操作的用户显示增量?显示状态消息很容易,但我们还想显示哪些数据处于冲突状态。欣赏你的想法。

编辑:数据不会作为一组表保存在数据库中,但它被序列化为 XML 文件,这就是保存在数据库中的内容。

0 投票
2 回答
557 浏览

http - if-match HTTP 标头是否需要两阶段提交?

我正在尝试设计一个 RESTful Web API,所以我一直在研究rfc2616。我喜欢使用 ETags 进行乐观并发的想法,并试图用它来以一种安全的方式添加资源而没有竞争条件。但是,我注意到第 14.24 节中有以下两个语句:

如果请求在没有 If-Match 头字段的情况下会导致 2xx 或 412 状态以外的任何状态,则必须忽略 If-Match 头。

旨在更新资源(例如,PUT)的请求可以包含一个 If-Match 头字段,以表明如果对应于 If-Match 值(单个实体标签)的实体不再是,则不得应用请求方法该资源的表示。

我正在使用 RDBMS,并且在我尝试之前不知道事务是否会成功提交,所以我认为第一个要求似乎有点繁重。考虑一个情况,有人提供了一个If-Match不匹配的 ETag 的标头:如果提交成功,那么我应该注意If-Match标头,不尝试提交,并返回 412。如果提交失败,那么没有If-Match标头的请求将导致非 2XX/412 响应,所以我必须忽略If-Match标头,这意味着我应该尝试提交。

据我所知,我有两个选择:

  1. 在尝试提交之前,使用两阶段提交来预见提交是否会成功。
  2. 忽略上面的第一个要求,并返回 412,即使忽略If-Match会导致非 2XX/412 响应。(这是我倾向于的那个)

还有其他想法吗?我误解了规格吗?

0 投票
1 回答
1583 浏览

hibernate - 休眠 - 由于 StaleObjectStateException 重试失败的更新仍会尝试保存陈旧的实例

我在休眠和版本控制方面遇到问题。我正在使用 Hibernate 3.6.7-Final。这是来自我的 DAO 类的代码片段(它由使用 @Transactional 注释的 Spring Beans 调用,因此它本身不是事务性的,但为了强制 StaleObjectStateException,使用了刷新):

版本是一个长值映射,如下所示:

问题是,用户永远不会被保存,代码只会永远循环。我调试了一下,结果发现hibernate有一个ActionQueue的概念,并且在内部,它在不同的集合中有插入、更新等。对于上面代码的每个循环,更新集合都会增长 1。它失败了,因为它总是尝试在该集合中的索引 0 处执行更新,这是“陈旧”的,并且在该点失败,并且没有尝试使用刷新的版本执行更新。有没有办法让这个工作?

也许一些关于我想要做什么的背景,所以也许更聪明的人将能够提出一个更好的解决方案:假设没有版本控制,并且用户有一个包含无效登录计数的列。每次失败,此计数都会增加一,并在成功登录时重置。(我们用它来设置用户在 x 次不成功尝试后何时可以登录的超时,以防止对帐户的暴力破解,但这在这里无关紧要。)现在,假设攻击者使用攻击,其中服务器上的多个线程可以访问同一个用户帐户,当 2 个线程读取失败计数为 2 的用户时,线程 1 将其更新为 3,保存,然后线程 2 将其更新为 3,并保存 -我们刚刚失去了一次不成功的尝试,这是一个错误。

所以,为了解决这个问题,我想引入版本控制列,在这种情况下,它不会导致上面的线程 2 抛出异常,在这种情况下,将重试操作(可能,但高度不太可能,在一个循环中) - 基本上,这将引入保存用户的序列化,但基于乐观锁定。如前所述,这不起作用。

有人可以帮我解决这个问题吗?这是一个好主意吗?也许有更好的方法?为什么休眠代码段不起作用?

0 投票
1 回答
636 浏览

ruby-on-rails - increment_counter 是否间接操纵 lock_version?

increment_counter是否间接操纵lock_version

我正在测试并发性,我注意到lock_version它正在增加。即使,我不是从ActiveRecord::StaleObjectError.

http://api.rubyonrails.org/classes/ActiveRecord/Locking/Optimistic.html

这是否意味着自动increment_counter触发救援ActiveRecord::StaleObjectError

0 投票
1 回答
8543 浏览

java - 从休眠乐观锁定异常中恢复

我有这样的方法:

我期待通过使用 REQUIRES_NEW 事务传播和显示的递归,StaleObjectStateException 最终会清除,但事实并非如此。

我如何从这个异常中恢复?

0 投票
1 回答
279 浏览

entity-framework - 是否可以使用 Entity Framework 4.1 (EF4.1) 实现字段级乐观并发

我所有的应用程序都使用字段级乐观并发。

这通过跟踪原始数据库值并在原始值、更新值和当前数据库值之间执行 3 路比较来确定 (a) 用户更新了什么和 (b) 其他用户更新了什么。

我的应用程序将字段分组在一行中,并允许多个用户更新同一行中的不同组而不会发生冲突。

这是因为不同部门处理相同记录的不同字段是很常见的。

EF4.1似乎只支持非常基础的基于整行的并发模型!这意味着当没有任何冲突时,用户将面临无休止的冲突......

是否可以覆盖内置行为?

0 投票
0 回答
784 浏览

websphere - 版本更改时未抛出 OptimisticLockException

我创建了一个简单的 EJB 应用程序,该应用程序使用 JPA 进行持久性,并且遇到了一个问题,即乐观锁定没有像我预期的那样运行。

该应用程序包含一个名为的类,该类Site定义了数据库中名为 SITE 的表的模型。SITE 表包含一个名为 ROW_VERSION 的列,该列在Site类中使用@version注释进行引用。

每当更新记录时,ROW_VERSION 都会增加 1。到目前为止,一切都很好。

当应用程序使用该EntityManager find方法读取行和该方法更新行之间的时间行发生变化时,就会出现问题EntityManager merge。由于该行的 ROW_VERSION 已增加 1,因此与EntityManager find调用该方法时不同,因此我希望OptimisticLockException抛出一个,而是将更改写入表并进而覆盖所做的更改其他过程。

该应用程序在 WebSphere 8.5 上运行,并使用容器提供的 OpenJPA。

我是否误解了乐观锁定应该如何工作,或者我需要做些什么来实现这一点OptimisticLockException

站点类如下:

应用程序使用 Generic DAO 包装类来调用 EntityManager 方法。课程内容如下:

更新- 我做了更多调查,发现了这个http://pic.dhe.ibm.com/infocenter/wasinfo/v8r0/index.jsp?topic=%2Fcom.ibm.websphere.nd.multiplatform.doc% 2Finfo%2Fae%2Fae%2Fcejb_genversionID.html但即使我添加了@VersionColumn 和@VersionStrategy 注释,我仍然无法抛出OptimisticLockException。