问题标签 [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.
java - 忽略乐观锁定
我有包含 @version 字段的实体。有时我需要更新它,尽管有乐观锁定异常。
在那种情况下我可以以某种方式关闭它吗?或者我应该重新加载实体并重试保存它 n 次,直到它更新?
jpa - JPA - @Version - 读取时增加
我已经实现了一个带有 @version 注释的简单实体 ejb。我希望每次更新实体后版本号都会增加。
但这似乎没有按预期工作。此外,每次我读取实体时,版本号都会自动增加(!?)。我希望版本只在提交后增加?
谁能解释为什么我的版本在阅读时也会增加?
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 将与请求不同。但是由于某种原因,如果我这样做了,那么即使在事务提交之后,请求对象上的锁定也不会被释放。代码如下所示
有人可以帮我吗?
谢谢。
丹尼尔
java - Web 应用程序中的乐观锁定
我们正在为我们的多租户应用程序构建客户配置工具。多个用户可以使用相同的配置,因此我们希望避免冲突。我们知道乐观锁定是要走的路。但是想知道如何向执行冲突操作的用户显示增量?显示状态消息很容易,但我们还想显示哪些数据处于冲突状态。欣赏你的想法。
编辑:数据不会作为一组表保存在数据库中,但它被序列化为 XML 文件,这就是保存在数据库中的内容。
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
标头,这意味着我应该尝试提交。
据我所知,我有两个选择:
- 在尝试提交之前,使用两阶段提交来预见提交是否会成功。
- 忽略上面的第一个要求,并返回 412,即使忽略
If-Match
会导致非 2XX/412 响应。(这是我倾向于的那个)
还有其他想法吗?我误解了规格吗?
hibernate - 休眠 - 由于 StaleObjectStateException 重试失败的更新仍会尝试保存陈旧的实例
我在休眠和版本控制方面遇到问题。我正在使用 Hibernate 3.6.7-Final。这是来自我的 DAO 类的代码片段(它由使用 @Transactional 注释的 Spring Beans 调用,因此它本身不是事务性的,但为了强制 StaleObjectStateException,使用了刷新):
版本是一个长值映射,如下所示:
问题是,用户永远不会被保存,代码只会永远循环。我调试了一下,结果发现hibernate有一个ActionQueue的概念,并且在内部,它在不同的集合中有插入、更新等。对于上面代码的每个循环,更新集合都会增长 1。它失败了,因为它总是尝试在该集合中的索引 0 处执行更新,这是“陈旧”的,并且在该点失败,并且没有尝试使用刷新的版本执行更新。有没有办法让这个工作?
也许一些关于我想要做什么的背景,所以也许更聪明的人将能够提出一个更好的解决方案:假设没有版本控制,并且用户有一个包含无效登录计数的列。每次失败,此计数都会增加一,并在成功登录时重置。(我们用它来设置用户在 x 次不成功尝试后何时可以登录的超时,以防止对帐户的暴力破解,但这在这里无关紧要。)现在,假设攻击者使用攻击,其中服务器上的多个线程可以访问同一个用户帐户,当 2 个线程读取失败计数为 2 的用户时,线程 1 将其更新为 3,保存,然后线程 2 将其更新为 3,并保存 -我们刚刚失去了一次不成功的尝试,这是一个错误。
所以,为了解决这个问题,我想引入版本控制列,在这种情况下,它不会导致上面的线程 2 抛出异常,在这种情况下,将重试操作(可能,但高度不太可能,在一个循环中) - 基本上,这将引入保存用户的序列化,但基于乐观锁定。如前所述,这不起作用。
有人可以帮我解决这个问题吗?这是一个好主意吗?也许有更好的方法?为什么休眠代码段不起作用?
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
?
java - 从休眠乐观锁定异常中恢复
我有这样的方法:
我期待通过使用 REQUIRES_NEW 事务传播和显示的递归,StaleObjectStateException 最终会清除,但事实并非如此。
我如何从这个异常中恢复?
entity-framework - 是否可以使用 Entity Framework 4.1 (EF4.1) 实现字段级乐观并发
我所有的应用程序都使用字段级乐观并发。
这通过跟踪原始数据库值并在原始值、更新值和当前数据库值之间执行 3 路比较来确定 (a) 用户更新了什么和 (b) 其他用户更新了什么。
我的应用程序将字段分组在一行中,并允许多个用户更新同一行中的不同组而不会发生冲突。
这是因为不同部门处理相同记录的不同字段是很常见的。
EF4.1似乎只支持非常基础的基于整行的并发模型!这意味着当没有任何冲突时,用户将面临无休止的冲突......
是否可以覆盖内置行为?
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。